数据源

数据源

现在很多WEB服务器(Weblogic,WebSphere, Tomcat)都提供了DataSoruce的实现,即连接池的实现。通常我们把DataSource的实现,按其英文含义称之为数据
源,数据源中都包含了数据库连接池的实现。
也有一些开源组织提供了数据源的独立实现:
•DBCP数据库连接池
•C3P0数据库连接池
实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

DBCP数据源

lDBCP是Apache软件基金组织下的开源连接池实现,使用DBCP数据源,应用程序应在系统中增加如下两个jar文件:
•Commons-dbcp.jar:连接池的实现
•Commons-pool.jar:连接池实现的依赖库
lTomcat的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。


dbcp实例代码:

static{
		InputStream in = JdbcUtil.class.getClassLoader().
				getResourceAsStream("dbcpconfig.properties");
		Properties prop = new Properties();
		prop.load(in);
		
		BasicDataSourceFactory factory = new BasicDataSourceFactory();
		dataSource = factory.createDataSource(prop);
      }

DBCPUtils.java;

DBCPUtils..java:
package com.heima.utils;

import java.awt.image.DataBuffer;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DBCPUtils {

	private static DataSource ds ;
	
	static {
		//将配置文件加载进来
		InputStream in = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties") ;
		Properties props = new Properties() ;
		try {
			props.load(in) ;
			ds = BasicDataSourceFactory.createDataSource(props) ;
		} catch (Exception e) {
			throw new RuntimeException("服务器忙") ;
		}
	}
	
	//提供获取连接的方法
	public static Connection getConnection(){
		try {
			return ds.getConnection() ;
		} catch (SQLException e) {
			throw new RuntimeException("服务器忙") ;
		}
	}
}

数据源_第1张图片

dbcpconfig.properties:
数据源_第2张图片

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/day19
username=root
password=sorry

#
initialSize=10

#最大连接数量
maxActive=50

#
maxIdle=20

#
minIdle=5

#
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ


C3P0数据源

数据源_第3张图片

C3p0Utils.java:

package com.heima.utils;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3p0Utils {

	private static DataSource ds ;
	
	static{
		ds = new ComboPooledDataSource() ;
	}
	
	//提供获取连接的方法
	public static Connection getConnection(){
		try {
			return ds.getConnection() ;
		} catch (SQLException e) {
			throw new RuntimeException("服务器忙") ;
		}
	}
	
}

数据源_第4张图片

C3p0-config.xml:


	
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/day16
		root
		root
	
		5
		10
		5
		20
	
	
	
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/day16
		root
		root
	
		5
		10
		5
		20
	
	
	
	
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/day16
		root
		root
	
		5
		10
		5
		20
	


数据源_第5张图片

tomcat服务器使用数据源的时候,自带有了tomcat-dbcp.jar这个数据源了,所以不用拷贝jar包了

获取Tomcat管理的数据源

1.Tomcat在启动时,会按照用户的配置,创建数据源,并把数据源对象绑定到一个名字上(用的是JNDI)。
2.JNDI:Java Naming and DIrectory Interface (JDK:javax.naming.*)

JNDI就好比window系统的注册表,它是一个Map结构。key是一个由路径和名称组成的字符串,value就是绑定的一个对象。

3.利用Tomcat管理数据源:

a、拷贝数据库驱动jar包到Tomcat\lib目录下

b、在应用的META-INF目录下建立一个名称为context.xml的配置文件



  

c、启动Tomcat,数据源就给你建好了

d、在应用中如何获取数据源(也可在jsp页面中获取)

public void add() throws Exception {
		
		Context initContext = new InitialContext();
		Context envContext = (Context) initContext.lookup("java:/comp/env");
		DataSource ds = (DataSource) envContext.lookup("jdbc/day16");
		Connection conn = ds.getConnection();
		System.out.println(conn);
	}

或者写成一句:

<%
		Context initContext = new InitialContext();
	//	Context envContext = (Context) initContext.lookup("java:/comp/env");
		//DataSource ds = (DataSource) envContext.lookup("jdbc/day16");
		DataSource ds = (DataSource) initContext.lookup("java:/comp/env/jdbc/day16") ;
		Connection conn = ds.getConnection();
		out.write(conn.toString() + "jjjjj") ;
	%>

特别注意:不要在main方法中获取数据源,获取不到


你可能感兴趣的:(JavaWeb)