您的位置:首页 > 编程语言 > Java开发

(java)数据库连接池

2009-01-01 14:24 113 查看
************************配置文件****************************

<?xml version="1.0" encoding="gb2312"?>

<driver xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<userdriver name="华工达梦数据库系统">

<driverclass>dm.jdbc.driver.DmDriver</driverclass>

<url>jdbc:dm://localhost:12345/guest</url>

<username>SYSDBA</username>

<password>123456</password>

<maxconnection>9</maxconnection>

<minconnection>5</minconnection>

</userdriver>

<!-- this program copyright by mengdejun -->

</driver>

************************************************************

Connectionpool.java

author:孟德军

************************************************************

package com.mdj.connectionpool;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

public class Connectionpool {

private String driverclass = "com.mysql.jdbc.Driver";// 数据库驱动类

private String username = "root";// 数据库用户名

private String password = "123456";// 数据库密码

private String url = "jdbc:mysql://localhost:3306/guest";// url

private int maxconnection = 10;// 连接池的最大容量

private int minconnection = 5;// 连接池的初始容量

private ArrayList pool = null;// 用于放连接池的容器

private Connection con = null;//

private static String path = "";

private static Connectionpool instance = null;

// 将构造方法私有法,禁止外部通过new语句创建实例.private修饰的构造方法不能被实例化,而只能通过一个方法来返回他的实例.

private Connectionpool() {

init();

addConnection();

}

private void init() {

readconfig();

pool = new ArrayList(maxconnection);

}

// 创建一个外部实例,通过getinstance方法创建实例.

public synchronized static Connectionpool getinstance() {

if (instance == null) {

instance = new Connectionpool();

}

return instance;

}

// 获取连接池中的连接.

public synchronized Connection getconnection() {

if (pool.size() > 0) {

con = (Connection) pool.get(0);

pool.remove(0);

return con;

} else {

return null;

}

}

public synchronized void releaseconnection(Connection con) {

pool.add(con);

}

public synchronized void closeconnectionpool(Connection con) {

for (int i = 0; i < pool.size(); i++) {

try {

((Connection) pool.get(i)).close();

pool.remove(i);

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 向连接池中添加初始连接.

private void addConnection() {

for (int i = 0; i < minconnection; i++) {

try {

Class.forName(driverclass);

con = DriverManager.getConnection(url, username, password);

pool.add(con);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

// 读取配置文件.

private void readconfig() {

path=System.getProperty("user.dir")+ "//sysconfig.xml";

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

try {

DocumentBuilder builder = factory.newDocumentBuilder();

Document document = builder.parse(path);

NodeList nodelist = document.getElementsByTagName("userdriver");

for (int i = 0; i < nodelist.getLength(); i++) {

Element element = (Element) nodelist.item(i);

driverclass = element.getElementsByTagName("driverclass").item(

0).getFirstChild().getNodeValue();

url = element.getElementsByTagName("url").item(0)

.getFirstChild().getNodeValue();

username = element.getElementsByTagName("username").item(0)

.getFirstChild().getNodeValue();

password = element.getElementsByTagName("password").item(0)

.getFirstChild().getNodeValue();

maxconnection = Integer

.parseInt(element.getElementsByTagName("maxconnection")

.item(0).getFirstChild().getNodeValue());

minconnection = Integer

.parseInt(element.getElementsByTagName("minconnection")

.item(0).getFirstChild().getNodeValue());

}

} catch (ParserConfigurationException e) {

e.printStackTrace();

} catch (SAXException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

************************************************************

ConnectionpoolTest.java

author:孟德军

************************************************************

package com.mdj.test;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import com.mdj.pool.ConnectionPool;

public class Test {

public static void main(String[] args) {

ConnectionPool pool;

Connection con;

long start = System.currentTimeMillis();

String sql="select * from userinfo";

for (int i = 0; i < 100; i++) {

pool = ConnectionPool.getinstance();

con = pool.getconnection();

try {

Statement statement = con.createStatement();

ResultSet result = statement

.executeQuery(sql);

while (result.next()) {

}

result.close();

statement.close();

pool.release(con);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}System.out.println("连接池连接");

System.out.println(System.currentTimeMillis() - start+"ms");

long start1=System.currentTimeMillis();

for(int i=0;i<100;i++){

try {

Class.forName("com.mysql.jdbc.Driver");

Connection con1=DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","123456");

Statement stm1=con1.createStatement();

ResultSet result=stm1.executeQuery(sql);

while(result.next()){

}

result.close();

stm1.close();

con1.close();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch(SQLException e){

e.printStackTrace();

}

}

System.out.println("普通连接");

System.out.println(System.currentTimeMillis()-start1+"ms");

}

}

当连接池连接和普通连接执行一百次时,结果如下:

连接池连接:1723ms

普通连接:19041ms

*******************************************************************************************

效果很明显,这仅仅是我写的一个连接池,诸多因素没有考虑,你可以到网上下载连接池产品.poolman等等.

其实国产数据库系统还是蛮好的,支持国产!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: