下面是详细的“Oracle JDBC连接BUG解决方案”的攻略。
问题描述
使用Java程序连接Oracle数据库时,经常会遇到连接时出现“ORA-12519, TNS:no appropriate service handler found”的错误提示,造成无法连接数据库的情况。这个问题一般出现在高并发的情况下。
原因分析
这个问题的产生是由于Oracle数据库在处理大量用户连接时,由于数据库链接池的限制,会不能够正常的接收新的连接请求,从而导致上述提示出现。
解决方案
针对这个问题,通常的解决方案是通过在Oracle数据库端增加一些参数来增加数据库链接池的大小,从而提高数据库支持高并发的能力。具体有以下几种方案:
1. 修改数据库的SPFILE
可以通过修改后的spfile
文件,来在数据库启动时对数据库链接池的大小进行设置。具体操作如下:
SQL> ALTER SYSTEM SET PROCESSES=500 SCOPE=spfile;
SQL> ALTER SYSTEM SET SESSIONS=1000 SCOPE=spfile;
注意: 以上参数根据实际情况可进行调整。
2. 增加数据库的进程数
通过增加数据库的进程数,可以增强数据库处理高并发连接的能力。具体操作如下:
SQL> ALTER SYSTEM SET processes=500 SCOPE=spfile;
注意: 以上参数根据实际情况可进行调整。
3. 增加JDBC连接的心跳检测时间
由于JDBC连接在使用过程中,可能由于网络因素和数据库负载限制等原因,导致连接中断的情况。可以通过调整JDBC连接的心跳检测时间来降低中断的几率。
对于使用DataSource
方式获取连接的程序,可以通过增加以下参数来调整心跳检测时间:
DataSource ds = getDataSource();
ds.setTestOnBorrow(true);
ds.setTestOnReturn(false);
ds.setTestWhileIdle(true);
ds.setTimeBetweenEvictionRunsMillis(60000);
ds.setNumTestsPerEvictionRun(-1);
注意: setTimeBetweenEvictionRunsMillis(60000)
表示心跳检测时间为60秒。setNumTestsPerEvictionRun(-1)
表示不限定心跳检测次数。
对于使用DriverManager
方式获取连接的程序,可以通过增加以下参数来调整心跳检测时间:
Properties props = new Properties();
props.setProperty("user", "admin");
props.setProperty("password", "admin");
props.setProperty("oracle.net.CONNECT_TIMEOUT", "5000");
props.setProperty("oracle.jdbc.ReadTimeout", "180000");
注意: oracle.net.CONNECT_TIMEOUT
表示连接超时时间为5秒,oracle.jdbc.ReadTimeout
表示读取超时时间为3分钟。
示例说明
示例一
如果使用Java程序连接Oracle数据库时,遇到ORA-12519错误,可以通过增加JDBC连接的心跳检测时间来解决。例如:
public class OracleJdbcTest {
private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String ORACLE_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private static final String ORACLE_USER = "hr";
private static final String ORACLE_PASSWORD = "hr";
public static void main(String[] args) throws Exception {
Class.forName(ORACLE_DRIVER);
Properties props = new Properties();
props.setProperty("user", ORACLE_USER);
props.setProperty("password", ORACLE_PASSWORD);
props.setProperty("oracle.net.CONNECT_TIMEOUT", "5000");
props.setProperty("oracle.jdbc.ReadTimeout", "180000");
Connection conn = DriverManager.getConnection(ORACLE_URL, props);
// 执行具体操作
conn.close();
}
}
示例二
如果使用DataSource
方式获取Oracle数据库连接时,遇到ORA-12519错误,可以通过增加连接池大小来解决。例如:
public class OracleJdbcTest {
private static final String ORACLE_DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String ORACLE_URL = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
private static final String ORACLE_USER = "hr";
private static final String ORACLE_PASSWORD = "hr";
public static void main(String[] args) throws Exception {
Class.forName(ORACLE_DRIVER);
DataSource ds = getDataSource();
Connection conn = ds.getConnection(ORACLE_USER, ORACLE_PASSWORD);
// 执行具体操作
conn.close();
}
private static DataSource getDataSource() throws Exception {
OracleConnectionPoolDataSource ds = new OracleConnectionPoolDataSource();
ds.setURL(ORACLE_URL);
ds.setUser(ORACLE_USER);
ds.setPassword(ORACLE_PASSWORD);
ds.setMinLimit(1);
ds.setMaxLimit(100);
ds.setInitialLimit(1);
return ds;
}
}
总结
通过以上方案的操作,可以有效提高Oracle数据库的高并发连接处理能力,避免ORA-12519错误的出现。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Oracle JDBC连接BUG解决方案 - Python技术站