Javaweb配置最全的数据源配置

DBCP

  • DBCP是Apache推出的数据库连接池(Database Connection Pool)。
    操作步骤:

  • 添加jar包:
    commons-dbcp-1.4.jar
    commons-pool-1.5.6.jar

  • 添加属性资源文件
    dbcpconfig.properties文件。

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/db_user
username=root
password=root
initialSize=10
maxActive=50
maxIdle=20
minIdle=5
maxWait=60000
connectionProperties=useUnicode=true;characterEncoding=utf8
defaultAutoCommit=true
defaultReadOnly=
defaultTransactionIsolation=REPEATABLE_READ
  • 编写数据源工具类
public class DBUtil {
    public static Connection getConnection(){
        Connection conn = null;

        try {
            conn = getDataSource().getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }

        return conn;
    }

    private static DataSource getDataSource(){
        DataSource dataSource=null;
        Properties p = new Properties();
        try {
            p.load(DBUtil.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
            dataSource = BasicDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            throw new RuntimeException("获取DataSource对象失败");
        } 
        return dataSource;
    }
}

C3P0

操作步骤:

  • 添加jar包

c3p0-0.9.1.2.jar

  • 编写配置文件
    创建一个c3p0-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/db_user</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <property name="initialPoolSize">10</property>
    <property name="maxIdleTime">30</property>
    <property name="maxPoolSize">100</property>
    <property name="minPoolSize">10</property>
  </default-config>
</c3p0-config>
  • 编写数据源工具类
public class DBUtil {
    private static DataSource dataSource = new ComboPooledDataSource();
    public static Connection getConnection(){
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

JavaWeb之Tomcat管理数据源

上面2中方式都需要导入jar包,在JavaWeb服务器Tomcat中其实内置了数据源。所以不需要导入jar包。

Tomcat内置数据源其实也是DBCP,是Tomcat的lib目录下的tomcat-dbcp.jar。

配置数据源的步骤:

  • 拷贝数据库连接的jar mysql-connector-java-5.1.7-bin.jar到tomcat/lib目录下

  • 配置数据源XML文件

<Context>
     <Resource name="jdbc/login_register" auth="Container" type="javax.sql.DataSource"
           maxActive="100" maxIdle="30" maxWait="10000"
           username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/db_user"/>
</Context>
  • 如果是在当前应用的META-INF中创建context.xml,编写数据源,那么只有当前应用可以使用。

  • 使用连接池,封装工具类

public class DBUtil {
    public static Connection getConnection(){
        Connection conn = null;
        try {
            Context c = new InitialContext();
            DataSource dataSource = (DataSource) c.lookup("java:/comp/env/jdbc/login_register");//这里的jdbc/login_register和篇配置文件中的name属性一致
            conn = dataSource.getConnection();
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (NamingException e) {
            e.printStackTrace();
        }

        return conn;
    }
}

BoneCP

  • bonecp 号称比c3p0 dbcp 性能快25倍,主要是因为 bonecp采用了1.5引入的并行包,抛弃了锁机制
  • (官方主页)[http://jolbox.com/index.html?page=http://jolbox.com/download.html]
  • 这里提供的maven的依赖 ,另为例子用了单机数据库hsqldb ,所以还需要你导入这个包,不过你可以
    用本机的任意一款驱动尝试链接,方式与原始的jdbc连接方式是相同的.
  • 这里有一篇的很全面的参数解释:

(链接)[http://chirs1012f.iteye.com/blog/805261]

  • maven 依赖
<dependency>
			<groupId>com.jolbox</groupId>
			<artifactId>bonecp</artifactId>
			<version>0.6.5</version>
			<scope>compile</scope>
		</dependency>
	<!-- This is the HSQLDB database in use by this test. Replace with MySQL, PostgreSQL etc here if you wish. -->
		<dependency>
			<groupId>hsqldb</groupId>
			<artifactId>hsqldb</artifactId>
			<version>1.8.0.10</version>
			<scope>compile</scope>
		</dependency>
  • jdbc基本代码
public class ExampleJDBC {
 
	/** Start test
	 * @param args none expected.
	 */
	public static void main(String[] args) {
		BoneCP connectionPool = null;
		Connection connection = null;
 
		try {
			// load the database driver (make sure this is in your classpath!)
			//替换为mysql等驱动
			Class.forName("org.hsqldb.jdbcDriver");
		} catch (Exception e) {
			e.printStackTrace();
			return;
		}
		
		try {

			// setup the connection pool
			BoneCPConfig config = new BoneCPConfig();
			//链接的地址
			config.setJdbcUrl("jdbc:hsqldb:mem:test"); // jdbc url specific to your database, eg jdbc:mysql://127.0.0.1/yourdb
			config.setUsername("sa"); 
			config.setPassword("");
			config.setMinConnectionsPerPartition(5);
			config.setMaxConnectionsPerPartition(10);
			config.setPartitionCount(1);
			connectionPool = new BoneCP(config); // setup the connection pool
			
			connection = connectionPool.getConnection(); // fetch a connection
			
			if (connection != null){
				System.out.println("Connection successful!");
				Statement stmt = connection.createStatement();
				ResultSet rs = stmt.executeQuery("SELECT 1 FROM INFORMATION_SCHEMA.SYSTEM_USERS"); // do something with the connection.
				while(rs.next()){
					System.out.println(rs.getString(1)); // should print out "1"'
				}
			}
			connectionPool.shutdown(); // shutdown connection pool.
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if (connection != null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
  • 由于现在流行使用ssm 技术 所以提供spring,其他去官方查
<!-- BoneCP configuration -->
<bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
   <property name="driverClass" value="com.mysql.jdbc.Driver" />
   <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb" />
   <property name="username" value="root"/>
   <property name="password" value="abcdefgh"/>
   <property name="idleConnectionTestPeriod" value="60"/>
   <property name="idleMaxAge" value="240"/>
   <property name="maxConnectionsPerPartition" value="30"/>
   <property name="minConnectionsPerPartition" value="10"/>
   <property name="partitionCount" value="3"/>
   <property name="acquireIncrement" value="5"/>
   <property name="statementsCacheSize" value="100"/>
   <property name="releaseHelperThreads" value="3"/>
</bean>
@Component
public class Foo {
 
@Autowired
DataSource ds;
 
 public void testBoneCP() throws SQLException {
    Connection connection = ds.getConnection();
    System.out.println(connection); // do something with the connection here..
 }
 
}

HikariCP

  • 技术总是在进步的,大致意思是ps:红色框中的部分意思:虽然BoneCP性能优于老旧的C3PO和DBCP连接池,但是现在应该被舍弃了,以迎接HikariCP
    作者词语之间充满了悲凉之感,好比当年的少年侠客,风流倜傥,如今已是迟暮之年,不得不退出江湖,何其悲凉。
    在笔者胡乱感伤一通过后,那么问题就来了。
  • Github主页:(主页)[http://brettwooldridge.github.io/HikariCP/]
      HikariCP是一个高效的数据库连接池。
  • 详细的其他方式 请访问 (官方)[https://github.com/brettwooldridge/HikariCP/wiki]
  • 限于篇章,下面介绍快速的使用方法
    -下面spring 配置
<!-- HikariCP 高性能数据库连接池 -->
    <bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/black1?useUnicode=true&amp;characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
        <!-- Default settings -->
        <!-- 控制自动提交行为 default:true -->
        <property name="autoCommit" value="true"/>
        <!--连接池获取的连接是否只读 default:false-->
        <property name="readOnly" value="false"/>
        <!--控制连接的事务隔离等级 default:none-->
        <property name="transactionIsolation" value="none"/>
        <!--设置catalog以便于支持查看catalogs , 若不指定的话将直接使用 JDBC driver使用的 default:none-->
        <property name="catalog" value="none"/>
        <!--最大连接超时时间 default:30秒-->
        <property name="connectionTimeout" value="30000"/>
        <!--最大空闲超时时间 default:10分钟   -->
        <property name="idleTimeout" value="600000"/>
        <!--连接池中一个连接的最大生命周期 default:30分钟-->
        <property name="maxLifetime" value="1800000 "/>
        <!--  ...还有一些其他配置属性 有兴趣可以看看 O(∩_∩)O哈哈~ -->
    </bean>
    
  • spring4 的无xml 配置方式
@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(dataSource());
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory().getObject());
        return txManager;
    }

    private DataSource dataSource() {
        final HikariDataSource ds = new HikariDataSource();
        ds.setMaximumPoolSize(100);
        ds.setDataSourceClassName("com.mysql.jdbc.jdbc2.optional.MysqlDataSource");
        ds.addDataSourceProperty("url", url);
        ds.addDataSourceProperty("user", username);
        ds.addDataSourceProperty("password", password);
        ds.addDataSourceProperty("cachePrepStmts", true);
        ds.addDataSourceProperty("prepStmtCacheSize", 250);
        ds.addDataSourceProperty("prepStmtCacheSqlLimit", 2048);
        ds.addDataSourceProperty("useServerPrepStmts", true);
        return ds;
    }

    private Properties hibernateProperties() {     
        final Properties properties = new Properties();
       // (Dialect, 2nd level entity cache, query cache, etc.)
        return properties;
    }
 
}

  • Tomcat 数据源配置
<Resource name="jdbc/OracleHikari" auth="Container"
      factory="com.zaxxer.hikari.HikariJNDIFactory"
      type="javax.sql.DataSource"
      minimumIdle="5" 
      maximumPoolSize="10"
      connectionTimeout="300000"
      dataSourceClassName="oracle.jdbc.pool.OracleDataSource"
      dataSource.implicitCachingEnabled="true" 
      dataSource.user="user"
      dataSource.password="pwd"
      dataSource.url="jdbc:oracle:thin:@orcl_server:1521:orcl"/>

阿里druid

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://127.0.0.1:3306/test 
jdbc.username=root 
jdbc.password=1qaz!QAZ

  • spring 配置文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
  init-method="init" destroy-method="close"> 
  <property name="driverClassName" value="${jdbc.driverClassName}" /> 
  <property name="url" value="${jdbc.url}" /> 
  <property name="username" value="${jdbc.username}" /> 
  <property name="password" value="${jdbc.password}" /> 
  <!-- 配置初始化大小、最小、最大 --> 
  <property name="initialSize" value="1" /> 
  <property name="minIdle" value="1" /> 
  <property name="maxActive" value="10" />

  <!-- 配置获取连接等待超时的时间 --> 
  <property name="maxWait" value="10000" />

  <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --> 
  <property name="timeBetweenEvictionRunsMillis" value="60000" />

  <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --> 
  <property name="minEvictableIdleTimeMillis" value="300000" />

  <property name="testWhileIdle" value="true" />

  <!-- 这里建议配置为TRUE,防止取到的连接不可用 --> 
  <property name="testOnBorrow" value="true" /> 
  <property name="testOnReturn" value="false" />

  <!-- 打开PSCache,并且指定每个连接上PSCache的大小 --> 
  <property name="poolPreparedStatements" value="true" /> 
  <property name="maxPoolPreparedStatementPerConnectionSize" 
   value="20" />

  <!-- 这里配置提交方式,默认就是TRUE,可以不用配置 -->

  <property name="defaultAutoCommit" value="true" />

  <!-- 验证连接有效与否的SQL,不同的数据配置不同 --> 
  <property name="validationQuery" value="select 1 " /> 
  <property name="filters" value="stat" /> 
  <property name="proxyFilters"> 
   <list> 
    <ref bean="logFilter" /> 
   </list> 
  </property> 
 </bean>
 
  • 测试类
public class TestMain {

 public static void loadLoggerContext() { 
  System.getProperties().put("logback.configurationFile", "./conf/logback.xml"); 
  LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
  StatusPrinter.setPrintStream(System.err); 
  StatusPrinter.print(lc); 
 }

 public static void main(String[] args) { 
  try { 
   loadLoggerContext(); 
   FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("./conf/spring-base.xml"); 

  } catch (Exception e) { 
   System.out.println(e); 
  } 
 } 
}

原文地址:https://www.cnblogs.com/dgwblog/p/7684744.html