jdbc中关于connection的问题,求大神指教 20
首先描述下我的程序:在主线程下有多个并发的线程。我整个程序只创建了一个connection,用的单例模式。由于我的整个程序要隔5S中运行一次,所以,connection没...
首先描述下我的程序:在主线程下有多个并发的线程。我整个程序只创建了一个connection,用的单例模式。由于我的整个程序要隔5S中运行一次,所以,connection没有关闭,而是每次运行都是用同一个connection。但这样存在一个问题,当数据库服务关闭再开启后,connection就失效了,程序会报connection closed错误,需要重启程序才能正常运行。但若在每个方法里面都新创建connection,虽然最后关闭了,但还是会报错 connection reset.希望大神给一个好的解决方法。
主要代码如下:
由于字数限制,只能写主要代码:
private FileOperater() {
private static Connection conn = null;
private static final FileOperater fo = new FileOperater();
public static PreparedStatement ps = null;
public static ResultSet rs = null; try {
// 创建连接
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
//类似这样读写数据库的函数有很多
public synchronized static String loadLastUpdateTime() {
String result = null;
try {
String sql = "select * from update_record ";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
result = rs.getString(1);
}
ps.close();
rs.close();
if (StringUtils.isNotBlank(result)) {
return result;
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
close();
}
return DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
} 展开
主要代码如下:
由于字数限制,只能写主要代码:
private FileOperater() {
private static Connection conn = null;
private static final FileOperater fo = new FileOperater();
public static PreparedStatement ps = null;
public static ResultSet rs = null; try {
// 创建连接
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
//类似这样读写数据库的函数有很多
public synchronized static String loadLastUpdateTime() {
String result = null;
try {
String sql = "select * from update_record ";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
result = rs.getString(1);
}
ps.close();
rs.close();
if (StringUtils.isNotBlank(result)) {
return result;
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
close();
}
return DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss");
} 展开
1个回答
展开全部
jdbc和连接池对于你这个场景来说,都足够,既然用spring管理了,建议还是使用连接池,另外,spring自身没有实现连接池,一般都是对第三方连接池的包装,常见的有C3P0,dbcp以及最近比较流行的boneCP等,这几个配置都差不多太多,以boneCP为例:
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource"
destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
<property name="idleConnectionTestPeriod" value="60" />
<property name="idleMaxAge" value="240" />
<property name="maxConnectionsPerPartition" value="30" />
<property name="minConnectionsPerPartition" value="10" />
<property name="partitionCount" value="2" />
<property name="acquireIncrement" value="5" />
<property name="statementsCacheSize" value="100" />
<property name="releaseHelperThreads" value="3" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" />
</bean>
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询