Tag: h2

H2 Java插入忽略 – 允许exception

我正在开发一个与H2数据库连接的java插件。 我真正想要的是“插入忽略”声明; 但是,我知道H2并不支持这一点。 我也知道Merge,但这真的不是我想要的,如果记录存在我不想改变它。 我正在考虑的是只运行插入并让重复键exception发生。 但是,我不希望这填充我的日志文件。 数据库调用发生在我无法更改的导入类中。 所以我的问题是: 这是一件合理的事吗? 我不是一个让错误发生的人,但这似乎是这种情况下最好的方式(它不应该发生那么多)。 如何防止此exception命中我的日志文件? 如果没有办法阻止堆栈中的exception,我可以重定向输出的堆栈跟踪的输出吗? 谢谢。

使用预准备语句在循环中高效查询嵌入式数据库

前几天我问了一个类似的问题 ,但后来我意识到自己已经超前了。 我正在寻找有关处理以下方案的正确方法的建议。 我正试图以最快的方式为给定的地址和城市SELECT正确的经度和纬度。 我的COORDINATES表有25,000行,看起来像这样: 我有一个Java HashMap<Integer, List> ,它包含一个Integer作为键,以及一个包含2个条目,一个地址和一个城市的ArrayList 。 HashMap的大小为500。 我需要使用4种不同类型的SELECT语句,因为每种语句都比以前更宽松,如下所示: SELECT LATITUDE, LONGITUDE FROM coordinates WHERE(address::text = ? AND community::text = ?) UNION ALL SELECT LATITUDE, LONGITUDE FROM coordinates WHERE (address::text = ? AND community::text LIKE ?) UNION ALL SELECT LATITUDE, LONGITUDE FROM coordinates WHERE (address::text LIKE ? AND community::text = ?) UNION […]

H2 createTcpServer()不创建服务器?

在阅读H2 文档后 ,我编写了这个简单的应用程序来在本地目录中创建H2数据库: public static void main(String[] args) throws SQLException { String path = “C:/Temp/H2/”; File fpath = new File(path); fpath.mkdirs(); FileUtils.recursiveDelete(fpath); String dbName = “tata”; String connection = “jdbc:h2:file:” + path + dbName; Server server = Server.createTcpServer(connection); server.start(); server.stop(); } 这个程序运行正常,但是当我检查目标目录时,数据库不存在…(我正在使用版本1.3.161)

从H2数据库中的大表中选择随机行

我的数据库中有一个大表(可能有数百万条记录),我需要选择#X随机行(假设#X在10到50之间),但我需要这个查询尽可能最佳。 该表如下所示: CREATE TABLE sample ( id bigint auto_increment PRIMARY KEY, user_id bigint NOT NULL, screen_name VARCHAR NOT NULL, … ); 我四处搜寻,发现这样的答案: SELECT * FROM sample ORDER BY RAND() limit X. 但它在我看来,这将获取整个表然后排序,不是吗? 我认为最好生成10或50个随机整数,然后select * from sample where rowid in () 。 但afaik,在H2中缺少rowid概念,所以我可以选择在我的表中使用ID列。 如果我可以使用单个SQL查询执行此任务,那将是非常棒的。 有什么好建议吗?

H2不在我的Spring Boot应用程序中创建/更新表。 我的实体出了什么问题?

我想通过使用Hibernate创建一个CRUD存储库来在H2数据库中保留一些数据。 我无法让数据库存储我的条目。 目前,我正在尝试通过制作样本条目来更新数据库期间实现这一点。 条目在日志中看起来很好,但不创建/更新/生成表。 为什么Hibernate在这种情况下无法创建表? (如果问题出在我的数据结构中) 这是我的实体, Game.java类(我试过没有@Column注释,没有区别.Id不是自动生成的,我需要每次都能输入自己的ID): @Entity @Table(name = “GAME”) public class Game { @Id @Column (name = “ID”) private long id; @Column (name = “NAME”) private String name; @Column(name = “STORYLINE”, length = 4000) private String storyline; @Column(name = “AGGREGATED_RATING”) @JsonProperty(“aggregated_rating”) private double aggregatedRating; @Column(name = “FIRST_RELEASE_DATE”) @JsonProperty(“first_release_date”) private long firstReleaseDate; @Embedded […]

H2没有识别regexp_like

我编写了一个在Oracle数据库上运行的查询,该数据库使用函数REGEXP_LIKE来过滤查询中的某些行。 具体的函数调用是 regexp_like(col1, ‘[^[:alpha:]]’) 问题是当我在H2上运行查询时出现以下错误: org.h2.jdbc.JdbcSQLException: Function “REGEXP_LIKE” not found 如果我使用SQLDeveloper工具直接在Oracle数据库上运行查询,它将按预期返回。 可能导致这种情况的任何想法?

如何使用Spring Boot将H2连接到远程数据库而不是嵌入模式?

对于我的小型Spring Boot应用程序,我在src / main / resources下有这个配置: server.port = 8090 spring.datasource.driverClassName = org.h2.Driver spring.datasource.url = jdbc:h2:file:~/stapler 我知道此配置已正确选取,因为应用程序启动日志中存在有效的端口号8090。 还有一个@PostConstruct initDb()方法,它创建数据并将数据插入该数据库的2个表中: package com.avk.stapler.init; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.jdbc.core.JdbcTemplate; import javax.annotation.PostConstruct; @SpringBootApplication public class DbInitializer { @Autowired private JdbcTemplate jdbcTemplate; public static void main(String[] args) { SpringApplication.run(DbInitializer.class, args); } @PostConstruct private void initDb() { System.out.println(“Creating table […]

重置h2中的自动增量

我正在测试一个返回json响应的控制器但第一次测试失败,因为h2数据库没有重置自动增量id。 手动使用夹具或创建对象也存在同样的问题。 @Before public void setUp() { Fixtures.deleteAllModels(); Fixtures.loadModels(“data.yaml”); } 如何解决这个问题呢?

H2是否支持可序列化的隔离级别?

维基百科将Phantom读取现象描述为: 当在事务过程中执行两个相同的查询,并且第二个查询返回的行集合与第一个查询不同时,会发生幻像读取。 它还指出,对于可序列化的隔离级别,Phantom读取是不可能的。 我试图确保它在H2中是这样,但要么我想错了,要么我做错了什么,或者H2出了什么问题。 不过,这是代码: try(Connection connection1 = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) { connection1.setAutoCommit(false); try(Connection connection2 = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD)) { connection2.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); connection2.setAutoCommit(false); assertEquals(0, selectAll(connection1)); assertEquals(0, selectAll(connection2)); // A: select insertOne(connection1); // B: insert assertEquals(1, selectAll(connection1)); assertEquals(0, selectAll(connection2)); // A: select connection1.commit(); // B: commit for insert assertEquals(1, selectAll(connection1)); assertEquals(0, selectAll(connection2)); // A: select ??? } […]

无法从H2 db获得结果

我试图从h2 db获取值,但总是得到这个错误 org.h2.jdbc.JdbcSQLException: No data is available [2000-171] at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) at org.h2.message.DbException.get(DbException.java:169) at org.h2.message.DbException.get(DbException.java:146) at org.h2.message.DbException.get(DbException.java:135) at org.h2.jdbc.JdbcResultSet.checkOnValidRow(JdbcResultSet.java:2956) at org.h2.jdbc.JdbcResultSet.get(JdbcResultSet.java:2962) at org.h2.jdbc.JdbcResultSet.getInt(JdbcResultSet.java:306) 我google了一个答案 一定要调用rs.next(); 在使用任何getter方法之前。 但我打电话给rs.next()……就是无法理解 这是我的代码: public User getUser(int userId) throws SQLException { User u = new User(userId); try { Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(“SELECT * FROM invited_users WHERE user_id=” + […]