【发布时间】:2017-02-20 07:47:51
【问题描述】:
我将oracle.jdbc.pool.OracleDataSource 用于Oracle 池连接,但似乎连接在数据库中仍然有效。今天连接 Oracle 数据库时出错:
ORA-12516: TNS:listener 找不到具有匹配协议栈的可用处理程序
我们的数据库管理员告诉我,我的应用程序中有太多打开的连接处于“空闲”模式。
我用ojdbc7:
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<version>12.1.0.1</version>
</dependency>
Spring applicationContext.xml 文件:
<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
<property name="URL" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="connectionCachingEnabled" value="true" />
</bean>
DbConnect 类:
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class DbConnect {
@Autowired
private DataSource dataSource;
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
}
我还在我的 dao 级别使用 jdk7 try-with-resources 语法进行连接:
@Autowired
private DbConnect dbConnect;
public List<User> getAllUsers() {
List<User> list = new ArrayList<>();
try(Connection connection = dbConnect.getConnection()) {
try(PreparedStatement preparedStatement = connection.prepareStatement("select * from V_USERS t")) {
try(ResultSet resultSet = preparedStatement.executeQuery()) {
while(resultSet.next()) {
list.add(RowFetcher.fetchUser(resultSet));
}
}
}
}
catch(Exception e) {
log.error(e.getMessage(), e);
}
return list;
}
无法弄清楚实际问题出在哪里。我应该使用 c3p0 代替 OracleDataSource 吗? ojdbc7 中是否有任何错误或我的代码中有错误?
提前致谢!
【问题讨论】:
-
你应该发布
DbConnect的代码 -
我已经编辑了帖子。请查看更改
-
您的 dba 认为多少连接是合适的,Oracle 数据源中的默认设置是什么。
-
实例化了多少 Dbconnect?
-
@KarlP 我会说一个 DbConnect 实例(spring managed => singleton)问题可能是对
getAllUsers的并行调用太多
标签: java spring oracle datasource ojdbc