更新:显然Tomcat,从7.0.11开始,为您关闭DataSource,因此它在webapp的contextDestroyed中不可用.请参阅:https://issues.apache.org/bugzilla/show_bug.cgi?id = 25060
嗨,
我正在使用Spring 3.0和Java 1.6.
如果我以这种方式获得数据源:
<bean id="dataSource" class="my.data.Source" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:home"/>
<property name="username" value="user"/>
<property name="password" value="pw"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
然后在bean被销毁时关闭数据源.
如果我得到这样的数据源:
<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/db" />
Run Code Online (Sandbox Code Playgroud)
那么我是否必须在contextDestroyed监听器中显式关闭数据源?
谢谢,
保罗
首先,我不能使用声明性@Transactional方法,因为应用程序有多个 JDBC 数据源,我不想厌倦细节,但只要说 DAO 方法传递了正确的数据源来执行逻辑就足够了。所有 JDBC 数据源都具有相同的架构,当我为 ERP 系统公开其余服务时,它们是分开的。
由于这个遗留系统,有很多我无法控制的长期锁定记录,所以我想要脏读。
使用 JDBC 我将执行以下操作:
private Customer getCustomer(DataSource ds, String id) {
Customer c = null;
PreparedStatement stmt = null;
Connection con = null;
try {
con = ds.getConnection();
con.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
stmt = con.prepareStatement(SELECT_CUSTOMER);
stmt.setString(1, id);
ResultSet res = stmt.executeQuery();
c = buildCustomer(res);
} catch (SQLException ex) {
// log errors
} finally {
// Close resources
}
return c;
}
Run Code Online (Sandbox Code Playgroud)
好吧,我知道有很多样板。JdbcTemplate所以自从我使用spring以来我就尝试过。
使用Jdbc模板
private Customer getCustomer(JdbcTemplate t, String id) …Run Code Online (Sandbox Code Playgroud) 我知道这可能是重复的,具有讽刺意味的是,在我开始阅读这里和那里之前,我知道我知道它是什么(无需说出来但我仍然会说,请纠正我错在哪里):
它减轻程序员必须使用transaction.begin()和transaction.begin().如果你有一个调用两个DAO方法的方法,通常每个方法都包含commit()并transaction.begin 包含实际操作并调用它们,那么它将导致两个事务(如果前面的dao方法也应该回滚,则可能存在回滚问题).但是,如果你用transaction.commit你的方法,然后这些人DAO呼叫将被包裹在一个单一的@transactional- begin()周期.当然,如果你使用commit() DAO,一定不要使用@Transactional和begin() 方法我认为.
我正在创建一个使用嵌入式hsqldb的基于Spring的Web应用程序.我的spring配置非常简单:
<jdbc:embedded-database id="dataSource" type="HSQL" >
<jdbc:script location="classpath:scripts/create-table-if-not-exists" />
</jdbc:embedded-database>
Run Code Online (Sandbox Code Playgroud)
但是使用此配置,所有数据都存储在内存中.这是创建的数据源URL
jdbc:hsqldb:mem:dataSource
Run Code Online (Sandbox Code Playgroud)
我需要将数据保存到文件中.这样我可以在服务器重启后再次使用它.
我有这样的查询,我试图通过比较元组来过滤结果集(如IN子句中的SQL多列):
select *
from mytable
where (key, value) in (values
('key1', 'value1'),
('key2', 'value2'),
...
);
Run Code Online (Sandbox Code Playgroud)
这是有效的语法,并在我的Postgres 9.3数据库上正常工作.
我想通过Spring JDBC调用此查询,其中in值对来自a List<Map<String,String>>.
做这样的事情会很好:
List<Map<String, String>> valuesMap = ...;
String sql = "select * from mytable where (key, value) in (values :valuesMap)";
SqlParameterSource params = new MapSqlParameterSource("valuesMap", valuesMap);
jdbcTemplate.query(sql, params, rowMapper);
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我得到:
org.postgresql.util.PSQLException: No hstore extension installed.
at org.postgresql.jdbc2.AbstractJdbc2Statement.setMap(AbstractJdbc2Statement.java:1707) ~[postgresql-9.3-1101-jdbc41.jar:na]
at org.postgresql.jdbc2.AbstractJdbc2Statement.setObject(AbstractJdbc2Statement.java:1910) ~[postgresql-9.3-1101-jdbc41.jar:na]
at org.postgresql.jdbc3g.AbstractJdbc3gStatement.setObject(AbstractJdbc3gStatement.java:36) ~[postgresql-9.3-1101-jdbc41.jar:na]
at org.postgresql.jdbc4.AbstractJdbc4Statement.setObject(AbstractJdbc4Statement.java:47) ~[postgresql-9.3-1101-jdbc41.jar:na]
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:427) ~[spring-jdbc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235) ~[spring-jdbc-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:150) …Run Code Online (Sandbox Code Playgroud) 引起原因:org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:列“***”不允许为 NULL;SQL语句:
我正在学习Spring Core认证,我对Spring如何处理JDBC查询有些怀疑:
所以我知道我可以通过各种方式从我的数据库表中获取数据,具体取决于我希望获得的数据类型:
1)查询简单类型(作为int,long或String):我使用jdbcTemplate类的queryForObject()方法,类似于:
String sql = "SELECT count(*) FROM T_REWARD";
int rowsNumber = jdbcTemplate.queryForObject(sql, Integer.class);
Run Code Online (Sandbox Code Playgroud)
因此,为了获得一个简单的对象作为int值,我使用queryForObject()方法向它传递sql stattment和我期望在该方法的输出中接收的对象类型.
好的,这很简单,我认为没问题.
2)查询放入Map对象的整个表行:所以如果我不需要单个值(可能是某个表的特定行的单个列或类似于preovious示例的东西),我可以使用queryForMap( ..)和queryForList()方法,以这种方式:
2.1)queryForMap():我使用它,如果我期望将单个行放入单个Map对象中,其中每个列值都映射到我的Map中,如下所示:
String sql = "select * from T_REWARD where CONFIRMATION_NUMBER = ?";
Map<String, Object> values = jdbcTemplate.queryForMap(sql,confirmation.getConfirmationNumber());
Run Code Online (Sandbox Code Playgroud)
2.2)queryForList():如果我希望有更多行作为我的查询输出,我会使用它.因此,我将获得一个Map对象列表,其中每个Map对象代表查询输出的特定行.喜欢它的东西:
String sql = “select * from PERSON”;
return jdbcTemplate.queryForList(sql);
Run Code Online (Sandbox Code Playgroud)
我认为这也很清楚.
然后我可以使用JdbcTemplate 将ResultSet …
有没有人在 Clickhouse 中使用过 Spring JDBC?驱动程序类名称是什么?
spring.datasource.driver-class-name=<what is it?>
Run Code Online (Sandbox Code Playgroud) 背景
我使用 Oralce 作为数据库,使用 H2 Embedded 内存数据库进行集成测试。
我在 H2 中创建了一些表并能够获取一些插入的数据。但是,我无法检索我在 H2 中创建的序列的当前序列值。
我知道 Oracle 和 H2 不一样,并且使用相似但不同的语法。我还知道您可以在 H2 内存数据库中定义一些别名并嵌入 java 代码来代替 Oracle SQL 函数。这给了我一个提示,即必须有一个解决方法,可以通过 H2 数据库使用 Oracle 语法检索序列值。
问题
如何使 Oracle 选择序列当前值的语法适用于 H2?我是否需要创建别名并编写嵌入式 java 代码来代替 Oracle 语法?我有什么选择?
被测代码使用以下假设但类似的 SQL
select myschema.mysequence.nextval from dual
Run Code Online (Sandbox Code Playgroud)
但我收到如下错误
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "nextval" not found [42122-199]
Run Code Online (Sandbox Code Playgroud)
由于语法的差异,很明显这是行不通的。我正在寻找一种解决方法,而无需更改使用 Oracle 语法的正在测试的代码。
更新
我正在使用 Spring JDBC 的 EmbeddedDatabaseBuilder,这意味着我不会连接到单独的独立 H2 数据库实例,而是连接到动态创建的实例,其中包含 DDL 脚本来创建 DB 对象。
以下帖子以及已接受的答案帮助解决了这个问题。
关于使用 Spring JDBC,它工作得非常好,并且在使用批处理时比 JPA 有一些改进。
我很想了解当您已经拥有Spring Data JDBC 时为什么要使用 Spring Data JDBC。
我很想了解当您已经拥有Spring JDBC时为什么要使用R2DBC。
spring-jdbc ×10
java ×6
spring ×6
h2 ×2
jdbctemplate ×2
clickhouse ×1
database ×1
datasource ×1
hibernate ×1
hsqldb ×1
jdbc ×1
jndi ×1
postgresql ×1
r2dbc ×1
tomcat7 ×1
transactions ×1