日期:2014-05-16  浏览次数:20339 次

DriverManager与DataSource的区别以及JDBC测试代码
DriverManager与DataSource  连接数据库有何区别?
        DriverManager传统的jdbc连接,通过Class.forName("XXX"),的办法注册之后,就可以DriverManager.getConnection()获得连接了。
        DataSource是建立在JNDI服务基础上的,需要application server配置datasource.首先需要注册一个DataSource(一般在/META-INF/context.xml下)然后在web.xml文件中引用这个DataSource,就可以DataSource.getConnection()获得连接,具体操作参考(tomcat目录里的JNDI Resources小节)

DataSource 与 DBCP pool(连接池) 的区别?
        J2EE 服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。
相当于是优化了DataSource的一种工具

在spring里配置DataSource例子,xml如下:

<bean id="propertyConfigurer"   
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
<!--PropertyPlaceholderConfigurer类来读取xxx.properties配置文件信息,以key和value的形式-->  
<property name="locations">  
    <list>  
        <value>  
          /WEB-INF/classes/config/pkm/environment/jdbc.properties  
        </value>  
        <value>  
          <!--多个xxx.properties文件-->  
        </value>  
    </list>  
</property>  
</bean>  
  
<!--事实上是因为DriverManagerDataSource建立连接是只要有连接就新建一个connection,根本没有连接池的作用-->  
<!--两种不同的DataSource-->  
<!--单纯的DataSource-->  
<bean id="pkmDataSource"   
class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    <property name="driverClassName">  
        <value>${pkm.jdbc.driverClassName}</value>  
        <!--${pkm.jdbc.driverClassName}是jdbc.properties文件 中的key-->  
    </property>  
    <property name="url">  
        <value>${pkm.jdbc.url}</value>  
    </property>  
    <property name="username">  
        <value>${pkm.jdbc.username}</value>  
    </property>  
    <property name="password">  
        <value>${pkm.jdbc.password}</value>  
    </property>  
</bean>  
  
<!--连接池-->  
<bean id="pkmDataSource"   
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="false">  
    <property name="driverClassName" value="${pkm.jdbc.driverClassName}"/>  
    <property name="url" value="${pkm.jdbc.url}"/>  
    <property name="username" value="${pkm.jdbc.username}"/>  
    <property name="password" value="${pkm.jdbc.password}"/>  
    <property name="initialSize" value="5"/>  
    <property name="maxActive" value="10"/>  
    <property name="maxWait" value="60000"/>  
    <property name="poolPreparedStatements" value="true"/>    
</bean>  

在访问数量大,并发大大情况下,毫无疑问是要选择使用BasicDataSource连接池,因为有连接池的功能,无论是效率还是在资源利用率上都优于DriverManagerDataSource。


驱动管理DriverManager
public class JDBCTest {
    public static void main(String[] args) {
        String driver = "com.mysql.jdbc.Driver";
        String dbName = "spring";
        String passwrod = "root";
        String userName = "root";
        String url = "jdbc:mysql://localhost:3308/" + dbName;
        String sql = "select * from users";
 
        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, userName,
                    passwrod);
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                System.out.println("id : " + rs.getInt(1) + " name : "
                        + rs.getString(2) + " password : " + rs.getString(3));
            }
 
            // 关闭记录集
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {