注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

昆明帆妈的博客

生活的点点滴滴,被我这样记录着。。。。

 
 
 

日志

 
 

oracle 连接池使用好处  

2012-11-23 16:26:05|  分类: 工作 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       经常会碰到这样的情况:比如在递归或循环中,不断地向数据库插入数据或查找数据,如果象这样:

for (int i = 0; i < 100; i++) {
try {
Class.forName(driverClassName);
//System.setProperty("jdbc.drivers", "com.oracle.jdbc.Driver");
connection = DriverManager.getConnection(url, user, password);
statement = connection.createStatement();
resultSet = statement.executeQuery(sql);
while (resultSet.next()) {

}

} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (resultSet != null) {
resultSet.close();
resultSet = null;
}
if (statement != null) {
statement.close();
statement = null;
}
if (connection != null) {
connection.close();
connection = null;
}

} catch (Exception e) {
e.printStackTrace();
}
}
}

发现在没有使用连接池的情况下对数据库执行100次连接查询的时候,就会报ORA-12519(TNS:no appropriate service handler found),并发连接数过大。而使用连接池就不会报错。疑问的是:我在不使用连接池进行每一次连接数据表查询时,都会及时关闭流,应该是每次都释放连接的吧(也就是用了一个连接就释放一个连接,下次循环再开一个连接,那这样连接数不都应该一直是1个吗)

原因是:::被关掉的 Connection 并没有被 Oracle 数据库马上回收,而是处于 TIME_WAIT 状态。
Windows 中使用 netstat -ano | find ":1521" 可以看到所有的 1521 端口连接,看看有没有 TIME_WAIT 状态的
Linux 中使用 netstat -anp | grep 1521 同 Windows 中一样  TIME_WAIT 状态需要过一会儿才会真正意义上的断开

因此,即使设置数据库的最大连接数,也是无用的,会报错ORA-12519(TNS:no appropriate service handler found)。

100次不断地连接,不断地访问,测试结果,100次循环使用时间为:2779ms

 

oracle 连接池使用好处 - 402021476 - 402021476的博客

 

解决方案:用连接池:

   包括三个文件数据库连接池类(ConnectionPool.java)、数据库配置文件(dbpool.properties)、连接测试类(ConnnecitonTest.java)

第一步:先写好数据库配置文件 dbpool.properties


第二步:编写一个数据库连接池类 ConnectionPool.java

 

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import java.util.Vector;

public class ConnectionPool {

private Vector<Connection> pool;
private String driverClassName;
private String url;
private String username;
private String password;

private int poolSize = 1;

private static ConnectionPool instance = null;

private ConnectionPool() {
Init();
}

private void addConnection() {
Connection conn = null;
for (int i = 0; i < poolSize; i++) {
try {
Class.forName(driverClassName).newInstance();
conn = DriverManager.getConnection(url, username, password);
pool.add(conn);
} catch (Exception e) {
e.printStackTrace();
}
}
}

private void Init() {
// TODO Auto-generated method stub
pool = new Vector<Connection>(poolSize);
readConfig();
addConnection();
}

private void readConfig() {
// TODO Auto-generated method stub
try {
String path = System.getProperty("user.dir")
+ "
\\dbpool.properties";
FileInputStream in = new FileInputStream(path);
Properties properties = new Properties();
properties.load(in);
this.driverClassName = properties.getProperty("driverClassName");
this.url = properties.getProperty("url");
this.username = properties.getProperty("username");
this.password = properties.getProperty("password");
this.poolSize = Integer
.parseInt(properties.getProperty("poolSize"));
} catch (Exception e) {
e.printStackTrace();
System.out.println("读取配置文件错误");
}
}

public static ConnectionPool getInstance() {
if (instance == null) {
instance = new ConnectionPool();
}
return instance;
}

public synchronized void release(Connection conn) {
pool.add(conn);
}

public synchronized void closePool() {
for (int i = 0; i < pool.size(); i++) {
try {
((Connection) pool.get(i)).close();
} catch (Exception e) {
e.printStackTrace();
}
pool.remove(i);
}
}

public synchronized Connection getConnection() {
if (pool.size() > 0) {
Connection connection = null;
connection = pool.get(0);
pool.remove(connection);
return connection;
} else {
return null;
}
}
}

使用连接池,100次循环使用的时间是:902ms

 

  评论这张
 
阅读(82)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017