java中的连接池
2015-09-08 22:36
375 查看
以前连接数据库都是采用 jdbc 的方式来连接的,但是用这种方式连接数据库有一些问题。
问题:当某个网站同时访问的人数超出一定范围时数据库会崩溃(比如:淘宝也用jdbc的方式,那么双 11的 0点左右 同时访问的人数过多时数据库可能崩溃)
即使避免了这种情况,那么系统性能会降低。解决这种问题的最好办法就是用连接池的方式连接数据库。
当连接池中的所有连接对象都已经被用完,那么其他用户连接数据库时,需要等待,如果超过等待时间,那么返回值 -1
注:连接池的方式用两种,但我们用的最多的是第二种
使用步骤:
1、将数据库的驱动包,放在tomcat的lib目录中
2、修改tomcat中conf目录下面 cotext.xml文件
配置连接池的相关参数
<Resource
name="" 数据源引用名称(自定义)
type="" 数据源对应类型,包.类名
auth="" 管理者 //Container
username="" 用户名
password="" 密码
url="" 路径
driverClassName="" 驱动名
maxActive="" 最大连接数
maxIdle="" 最大空闲数
maxWait="" 等待时间,单位毫秒
/>
3、修改项目中 web.xml文件
<resource-ref>
<res-ref-name>数据源引用名称</res-ref-name>
<res-type>数据源对应类型</res-type>
<res-auth>Container</res-auth>
</resource-ref> 4、java代码如下
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBUtil {
/**
* 打开连接
* @return
*/
public static Connection getConn()
{
Connection conn = null;
try {
//创建容器对象
Context ctt = new InitialContext();
//创建数据源对象
DataSource ds =(DataSource)ctt.lookup("java:comp/env/数据源引用名称");
conn=ds.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
三、DBCP 连接池的使用(这种方式使用的最多)
DBCP(database ConnectionPool) 数据库连接池,第三方提供的一种连接池,是别人封装好的,我们自己不用写配置文件,别人已经帮我们写好了的
使用步骤:
1、 找到需要的jar包 (commons.pool-1.5.3.jar 和 commons-dbcp.jar ,一共需要两个),放在自己项目的 lib 中。
2、 自己建立连接数据库的工具类,在工具类中从 “连接池”中取出 连接对象
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil {
private static DataSource ds;
public static Connection getCon() {
Connection con = null;
if (ds == null) {
initDataSource();
}
try {
con = ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/**
* 设置连接池的参数,以及得到数据源的对象
*/
public static void initDataSource() {
// 设置连接池的参数:该方法是由第三方(DBCP)提供的,是别人封装好的
BasicDataSource dbs = new BasicDataSource();
// 数据库登录用户名
dbs.setUsername("scott");
// 数据库登录密码
dbs.setPassword("tiger");
// 路径
//如果要连接sqlserver则是:jdbc:sqlserver://localhost:1433;database=数据库名称
dbs.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
// 驱动名
// 我链接的是oracle数据库,如果要连接sqlserver则是:com.microsoft.sqlserver.jdbc.SQLServerDriver
dbs.setDriverClassName("oracle.jdbc.driver.OracleDriver");
// 设置最大连接数
dbs.setMaxActive(100);
// 设置最大空闲数
dbs.setMaxIdle(30);
// 设置等待时间,单位:毫秒
dbs.setMaxWait(10000);
ds = dbs;
}
// 测试有没有链接成功
// public static void main(String[] args) {
// System.out.println(getCon());
// }
}
3、 可以自己建立 “资源文件.properties” 存储 连接池的各种参数(一般我们是在src的下面建立,后缀名为 properties)
然后点击右边的 Add 添加(是通过 key--value 的形式保存的)
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil {
//定义数据源对象
private static DataSource ds;
/**
* 打开连接数据库(从连接池中取出连接对象)
* @return
*/
public static Connection getConn()
{
Connection conn = null;
//判断ds是否为空
if(ds==null)
{
initDataSource();
}
try {
//从连接池中取出连接对象
conn = ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 设置连接池的参数,以及 得到数据源对象
*/
public static void initDataSource()
{
//创建对象,读取资源文件中的信息,其中的参数就是:资源文件的路径 如:com.cn.dbcp
ResourceBundle rb = ResourceBundle.getBundle(path);
String userName=rb.getString("username");
String password =rb.getString("password");
String url = rb.getString("url");
String driverClassName =rb.getString("driverClassName");
String maxActive =rb.getString("maxActive");
String maxIdle = rb.getString("maxIdle");
String maxWait = rb.getString("maxWait");
//设置连接池的参数
BasicDataSource bds = new BasicDataSource();
//设置参数
bds.setUsername(userName);
bds.setPassword(password);
bds.setUrl(url);
bds.setDriverClassName(driverClassName);
bds.setMaxActive(Integer.parseInt(maxActive));
bds.setMaxIdle(Integer.parseInt(maxIdle));
bds.setMaxWait(Long.parseLong(maxWait));
ds=bds;
}
//测试是否连接成功
public static void main(String[] args) {
System.out.println(getConn());
}
}
问题:当某个网站同时访问的人数超出一定范围时数据库会崩溃(比如:淘宝也用jdbc的方式,那么双 11的 0点左右 同时访问的人数过多时数据库可能崩溃)
即使避免了这种情况,那么系统性能会降低。解决这种问题的最好办法就是用连接池的方式连接数据库。
一、连接池的原理
连接池我们也可以叫做 “缓冲池” ,提前在“连接池”中设定好一定数量的数据库连接对象,当用户连接数据库时,从“池子”中取出一个连接对象,当用户使用完之后关闭连接了再把取出的重新放到池子中当连接池中的所有连接对象都已经被用完,那么其他用户连接数据库时,需要等待,如果超过等待时间,那么返回值 -1
注:连接池的方式用两种,但我们用的最多的是第二种
二、“JDNI” 连接池的使用(该方式一般都不会使用,重点介绍第二种方式)
JDNI:(java命名目录和规则的api),JDNI 是tomcat提供的一个标准的一个连接池使用步骤:
1、将数据库的驱动包,放在tomcat的lib目录中
2、修改tomcat中conf目录下面 cotext.xml文件
配置连接池的相关参数
<Resource
name="" 数据源引用名称(自定义)
type="" 数据源对应类型,包.类名
auth="" 管理者 //Container
username="" 用户名
password="" 密码
url="" 路径
driverClassName="" 驱动名
maxActive="" 最大连接数
maxIdle="" 最大空闲数
maxWait="" 等待时间,单位毫秒
/>
3、修改项目中 web.xml文件
<resource-ref>
<res-ref-name>数据源引用名称</res-ref-name>
<res-type>数据源对应类型</res-type>
<res-auth>Container</res-auth>
</resource-ref> 4、java代码如下
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class DBUtil {
/**
* 打开连接
* @return
*/
public static Connection getConn()
{
Connection conn = null;
try {
//创建容器对象
Context ctt = new InitialContext();
//创建数据源对象
DataSource ds =(DataSource)ctt.lookup("java:comp/env/数据源引用名称");
conn=ds.getConnection();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
}
三、DBCP 连接池的使用(这种方式使用的最多)
DBCP(database ConnectionPool) 数据库连接池,第三方提供的一种连接池,是别人封装好的,我们自己不用写配置文件,别人已经帮我们写好了的使用步骤:
1、 找到需要的jar包 (commons.pool-1.5.3.jar 和 commons-dbcp.jar ,一共需要两个),放在自己项目的 lib 中。
2、 自己建立连接数据库的工具类,在工具类中从 “连接池”中取出 连接对象
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil {
private static DataSource ds;
public static Connection getCon() {
Connection con = null;
if (ds == null) {
initDataSource();
}
try {
con = ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return con;
}
/**
* 设置连接池的参数,以及得到数据源的对象
*/
public static void initDataSource() {
// 设置连接池的参数:该方法是由第三方(DBCP)提供的,是别人封装好的
BasicDataSource dbs = new BasicDataSource();
// 数据库登录用户名
dbs.setUsername("scott");
// 数据库登录密码
dbs.setPassword("tiger");
// 路径
//如果要连接sqlserver则是:jdbc:sqlserver://localhost:1433;database=数据库名称
dbs.setUrl("jdbc:oracle:thin:@localhost:1521:orcl");
// 驱动名
// 我链接的是oracle数据库,如果要连接sqlserver则是:com.microsoft.sqlserver.jdbc.SQLServerDriver
dbs.setDriverClassName("oracle.jdbc.driver.OracleDriver");
// 设置最大连接数
dbs.setMaxActive(100);
// 设置最大空闲数
dbs.setMaxIdle(30);
// 设置等待时间,单位:毫秒
dbs.setMaxWait(10000);
ds = dbs;
}
// 测试有没有链接成功
// public static void main(String[] args) {
// System.out.println(getCon());
// }
}
3、 可以自己建立 “资源文件.properties” 存储 连接池的各种参数(一般我们是在src的下面建立,后缀名为 properties)
然后点击右边的 Add 添加(是通过 key--value 的形式保存的)
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
public class DBUtil {
//定义数据源对象
private static DataSource ds;
/**
* 打开连接数据库(从连接池中取出连接对象)
* @return
*/
public static Connection getConn()
{
Connection conn = null;
//判断ds是否为空
if(ds==null)
{
initDataSource();
}
try {
//从连接池中取出连接对象
conn = ds.getConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
/**
* 设置连接池的参数,以及 得到数据源对象
*/
public static void initDataSource()
{
//创建对象,读取资源文件中的信息,其中的参数就是:资源文件的路径 如:com.cn.dbcp
ResourceBundle rb = ResourceBundle.getBundle(path);
String userName=rb.getString("username");
String password =rb.getString("password");
String url = rb.getString("url");
String driverClassName =rb.getString("driverClassName");
String maxActive =rb.getString("maxActive");
String maxIdle = rb.getString("maxIdle");
String maxWait = rb.getString("maxWait");
//设置连接池的参数
BasicDataSource bds = new BasicDataSource();
//设置参数
bds.setUsername(userName);
bds.setPassword(password);
bds.setUrl(url);
bds.setDriverClassName(driverClassName);
bds.setMaxActive(Integer.parseInt(maxActive));
bds.setMaxIdle(Integer.parseInt(maxIdle));
bds.setMaxWait(Long.parseLong(maxWait));
ds=bds;
}
//测试是否连接成功
public static void main(String[] args) {
System.out.println(getConn());
}
}
相关文章推荐
- jdbc中的Statement和PreparedStatement接口对象
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android之获取手机上的图片和视频缩略图thumbnails
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序