JDBC (未)

 基础JDBC

导入数据包 . 需要包括含有需要进行数据库编程的JDBC类的包。大多数情况下,使用 import java.sql.* 就可以了.

注册JDBC驱动程序. 需要初始化驱动程序,可以与数据库打开一个通信通道。

打开连接. 需要使用DriverManager.getConnection() 方法创建一个Connection对象,它代表与数据库的物理连接。

执行查询 . 需要使用类型声明的对象建立并提交一个SQL语句到数据库。

从结果集中提取数据 . 要求使用适当的关于ResultSet.getXXX()方法来检索结果集的数据。

清理环境. 需要明确地关闭所有的数据库资源相对依靠JVM的垃圾收集。[1]

 

/STEP 1. Import required packages
import java.sql.*;

public class FirstExample {
   // JDBC driver name and database URL
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/EMP";

   //  Database credentials
   static final String USER = "username";
   static final String PASS = "password";
   
   public static void main(String[] args) {
   Connection conn = null;
   Statement stmt = null;
   try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to database...");
      conn = DriverManager.getConnection(DB_URL,USER,PASS);

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();
      String sql;
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //STEP 6: Clean-up environment
      rs.close();
      stmt.close();
      conn.close();
   }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
   }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
   }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            stmt.close();
      }catch(SQLException se2){
      }// nothing we can do
      try{
         if(conn!=null)
            conn.close();
      }catch(SQLException se){
         se.printStackTrace();
      }//end finally try
   }//end try
   System.out.println("Goodbye!");
}//end main
}//end FirstExample
View Code

 

 数据库连接池

dbcp

 

/** [3]
     * 简单的dbcp
     * @return connection
     * @throws SQLException
     */
    public Connection getConnectionByDBCPSimple() throws SQLException {
        // 新建DBCP数据源
        BasicDataSource dataSource = new BasicDataSource();
        // 设置必要属性值
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/xiaotangai");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        // 从数据源获得数据库连接
        Connection connection = dataSource.getConnection();
        return connection;
    }

 dbcp util demo

package com.xiaotangai.study.jdbc.dbcp;

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.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

/**
 * DBCP(DataBase connection pool),数据库连接池。
 * 1、单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar
 * 2、添加配置属性文件 dbcp.properties
 * 3、编写DBCPUtil
 * @author xiaotangai
 * @date 2016年3月3日下午8:54:52
 */
public class DBCPUtil {
    
    private static DataSource dataSource;
    private static final String resource = "config/dbcp.properties";

    static {
        if(null==dataSource){
            createDataSource();
        }
    }

    private static DataSource createDataSource() {
        try {
            Properties properties = new Properties();
            InputStream inputStream = DBCPUtil.class.getClassLoader().getResourceAsStream(resource);
            properties.load(inputStream);
            return BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static Connection getConnection(){
        
        Connection connection = null;
        try {
            if(null==dataSource){
                dataSource = createDataSource();
            }
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

}
View Code

 dbcp.properties

# database information
driverClassName = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/xiaotangai?useUnicode=true&characterEncoding=utf-8
username = root
password = 123456

 

dbcp的基本配置

相关配置说明[2]:

  1. initialSize :连接池启动时创建的初始化连接数量(默认值为0)
  2. maxActive :连接池中可同时连接的最大的连接数(默认值为8,调整为20,高峰单机器在20并发左右,自己根据应用场景定)
  3. maxIdle:连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数 上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)
  4. minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,调整为5,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)
  5. maxWait  :最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限,调整为60000ms,避免因线程池不够用,而导致请求被无限制挂起)
  6. poolPreparedStatements:开启池的prepared(默认是false,未调整,经过测试,开启后的性能没有关闭的好。)
  7. maxOpenPreparedStatements:开启池的prepared 后的同时最大连接数(默认无限制,同上,未配置)
  8. minEvictableIdleTimeMillis  :连接池中连接,在时间段内一直空闲, 被逐出连接池的时间
  9. (默认为30分钟,可以适当做调整,需要和后端服务端的策略配置相关)
  10. removeAbandonedTimeout  :超过时间限制,回收没有用(废弃)的连接(默认为 300秒,调整为180)
  11. removeAbandoned  :超过removeAbandonedTimeout时间后,是否进 行没用连接(废弃)的回收(默认为false,调整为true)

c3p0

c3p0的配置方式[5]

分为三种,分别是 
1.setters一个个地设置各个配置项 
2.类路径下提供一个c3p0.properties文件 
3.类路径下提供一个c3p0-config.xml文件 

 2. 类路径下提供一个c3p0.properties文件 
文件的命名必须是c3p0.properties,里面配置项的格式为: 

c3p0.driverClass=com.mysql.jdbc.Driver 
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc 
c3p0.user=root 
c3p0.password=java 
上面只提供了最基本的配置项,其他配置项参照 文档配置,记得是c3p0.后面加属性名就是了,最后初始化数据源的方式就是这样简单: 
private static ComboPooledDataSource ds = new ComboPooledDataSource(); 
public static Connection getConnection() { 
    try { 
        return ds.getConnection(); 
    } catch (SQLException e) { 
        throw new RuntimeException(e); 
    } 

3.类路径下提供一个c3p0-config.xml文件  
这种方式使用方式与第二种差不多,但是有更多的优点 
(1).更直观明显,很类似hibernate和spring的配置 
(2).可以为多个数据源服务,提供default-config和named-config两种配置方式 
下面是一个配置模板: 

<c3p0-config> 
  <default-config>  
    <property name="user">root</property> 
    <property name="password">java</property> 
    <property name="driverClass">com.mysql.jdbc.Driver</property> 
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property> 
    <property name="initialPoolSize">10</property> 
    <property name="maxIdleTime">30</property> 
    <property name="maxPoolSize">100</property> 
    <property name="minPoolSize">10</property> 
    </default-config> 

    <named-config name="myApp"> 
    <property name="user">root</property> 
    <property name="password">java</property> 
    <property name="driverClass">com.mysql.jdbc.Driver</property> 
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property> 
     
    <property name="initialPoolSize">10</property> 
    <property name="maxIdleTime">30</property> 
    <property name="maxPoolSize">100</property> 
    <property name="minPoolSize">10</property> 
  </named-config> 
</c3p0-config> 
View Code

 


如果要使用default-config则初始化数据源的方式与第二种一样,如果要使用named-config里面配置初始化数据源,则只要使用一个带参数的ComboPooledDataSource构造器就可以了 
private static ComboPooledDataSource ds = new ComboPooledDataSource("myApp"); 

更改c3p0的xml文件的路径[6]

System.setProperty("com.mchange.v2.c3p0.cfg.xml","classloader:/resources/settings/c3p0-config.xml"); 

 

 相关配置说明:[4]

acquireIncrement #当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
acquireRetryAttempts #定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
acquireRetryDelay #两次连接中间隔时间,单位毫秒。Default: 1000
autoCommitOnClose #连接关闭时默认将所有未提交的操作回滚。Default: false
automaticTestTable #c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试 使用。Default: null
breakAfterAcquireFailure #获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false
checkoutTimeout #当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default: 0
connectionTesterClassName #通过实现ConnectionTester或QueryConnectionTester的类来测试连接。类名需制定全路径。 Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester
factoryClassLocation #指定c3p0 libraries的路径,如果(通常都是这样)在本地即可获得那么无需设置,默认null即可 Default: null
forceIgnoreUnresolvedTransactions #Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. (文档原文)作者强烈建议不使用的一个属性
idleConnectionTestPeriod #每60秒检查所有连接池中的空闲连接。Default: 0
initialPoolSize #初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3
maxIdleTime #最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
maxPoolSize #连接池中保留的最大连接数。Default: 15
maxStatements #JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个 connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭。Default: 0
maxStatementsPerConnection #maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0
numHelperThreads #c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3
overrideDefaultUser #当用户调用getConnection()时使root用户成为去获取连接的用户。主要用于连接池连接非c3p0的数据源时。Default: null
overrideDefaultPassword #与overrideDefaultUser参数对应使用的一个参数。Default: null
password #密码。Default: null
preferredTestQuery #定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null
propertyCycle #用户修改系统配置参数执行前最多等待300秒。Default: 300
testConnectionOnCheckout #因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。Default: false
testConnectionOnCheckin #如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
user #用户名。Default: null
usesTraditionalReflectiveProxies #早期的c3p0版本对JDBC接口采用动态反射代理。在早期版本用途广泛的情况下这个参数允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已经开始广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同时受到支持,但今后可能的版本可能不支持动态反射代理。Default: false

JDBC升级替代品

 

commons-dbutils

 

hibernate

 

mybatis

 

参考资料:

[0] 慕课网视频 JDBC  http://www.imooc.com/learn/157 http://www.imooc.com/learn/421

[1] JDBC教程 http://www.yiibai.com/jdbc/

[2] dbcp基本配置和重连配置  http://blog.itpub.net/7971010/viewspace-1114524/

[3] DBCP数据库连接池实例详解 http://jingyan.baidu.com/article/db55b6098aa37e4ba20a2f63.html

[4] c3p0 参数解释 http://kangzye.blog.163.com/blog/static/368192232010442162576/

[5] C3P0的配置方式 http://myokm123.iteye.com/blog/1743452

[6] 更改C3P0连接池的XML配置 http://blog.csdn.net/pg_guo/article/details/46039651 

 

待补充:例子代码 和理解

 

你可能感兴趣的:(JDBC (未))