1.自己手写一个数据库连接池
2.装饰模式,动态代理模式
3.通过动态代理实现数据库连接池
4.DBCP开源数据库连接池
5.C3P0开源数据库连接池
6.为Tomcat配置数据源
1.自己手写一个数据库连接池
public class MyPool implements DataSource{
private static List<Connection> pool = new LinkedList<Connection>();
static{
try{
Class.forName("com.mysql.jdbc.Driver");
for(int i=0;i<5;i++){
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
pool.add(conn);
}
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}
public Connection getConnection throws SQLException{
if(pool.size()==0){
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
pool.add(conn);
}
return pool.remove(0);
}
public void returnConn(Connection conn){
try{
if(conn != null && !conn.close()){
pool.add(conn);
}
}catch(Exception e){
e.printStackTrace(e);
}
}
}
2.装饰模式,动态代理模式
装饰模式:写一个类和被装饰者实现相同的接口,以保证装饰者和被装饰者有相同的方法。再提供构造方法允许用户将被装饰者传进来,对于不想改造的方法调用原来的,想改造的自己写
缺点:当被装饰者的方法太多时,那些不想改造的方法需要一个个调用,太麻烦。
动态代理模式:在已经有一个对象的前提下,再创建一个代理对象。谁想调用被代理的方法,就要先去调用代理对象。代理对象对于不想改造的让用户调原来的,对于想改造的,代理者自己写。
3.通过动态代理实现数据库连接池
自定义的连接池写了将conn还回pool的方法,但是用户不知道,用户只知道conn.close(),而且conn已经是一个对象了。在已有对象的前提下改造其中的方法,用动态代理。
public Connection getConnection throw SQLException{
if(pool.size()==0){
for(int i=0;i<3;i++){
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
pool.add(conn);
}
}
final Connection conn = pool.remove(0);
Connection proxy = (Connection)Proxy.newProxyInstance(conn.getClass().getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler(){
public Object invoke(Object proxy,Method method,Object[] args){
if("close".equals(method.getName())){
returnConn(conn);
return null
}else{
return method.invoke(conn,args);
}
}
});
return proxy;
}
我们自己都能写连接池了,别人肯定早就帮我们想好了,下面看看开源的数据库连接池
4.DBCP开源数据库连接池
方法一:(直接定义)
BasicDataSource source = new BasicDataSource();
source.setDriver("com.driver.mysql.jdbc");
source.setUrl("jdbc:mysql://localhost:3306/jdbc");
source.setUserName("root");
方法二:(运用配置文件定义)
Properties prop = new Properties();
prop.load(new FileReader("dbcp.config"));
BasicDataSourceFactory factory = new BasicDataSourceFactory();
DataSource source = factory.createSource(prop);
注:常用属性
driverClassName=com.mysql.jdbc.Driver //驱动
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=root
initalSize=10 //初始化连接
maxActive=50 //最大连接数
minIdle/maxIdle=10 //最小/最大空闲数
maxWait=60000 //超时等待时间(毫秒为单位)
5.C3P0开源数据库连接池
方法一:(直接设置)
CompoPooledDataSource source = new CompoPooledDataSource();
source.setDriverClass("com.mysql.jdbc.Driver");
source.setJdbcUrl("jdbc:mysql://localhost:3306/jdbc");
source.setUser("root");
source.setPassword("root");
方法二:(通过配置文件配置)
ComboPooledDataSource source = new ComboPooledDataSource();
在类加载器目录下名称为c3p0-config配置文件下配置:
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>
<property name="user">root</property>
<property name="password">root</property>
</default-config>
</c3p0-config>
注:如果有报错,说什么东西找不到的话,加上下面这句话:
System.setProperty("javax.xml.parses.DocumentBuliderFactory","com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
6.为Tomcat配置数据源
(1).为所以的web应用配置
tomcat/conf/context.xml的<Context>中配置
(2).为专门的web应用配置
^1.tomcat/conf/server.xml中的<Host>
^2.tomcat/conf/xxx.xml,自己写一个xml
^3.将web应用放在虚拟主机管理的目录下,然后在META-INF文件夹下创建一个context.xml,在<Context>标签中配置如下:
<Resource name="mySource" auth="Container" type="javax.sql.DataSourcde" username="root" password="root" droverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/jdbc" maxActive="8" maxIdle="4"/>
(3).怎么在程序中获的这个数据源
Context initCtx = new InitialContext();
Context jndi = (Context)initCtx.lookup("java:comp/env);
DataSource source = jndi.lookup("mySource");