一、JDBC(Java Database Connectivity)

  JDBC是Java语言中访问数据库的应用程序接口,可以为多种关系数据库提供统一访问。

jdbc.properties

jdbc.driverClass=com.microsoft.sqlserver.jdbc.SQLServerDriver
jdbc.url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test
jdbc.username=root
jdbc.password=root

测试类

public class DBUtil {

    public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {
Properties props = new Properties();
props.load(new FileInputStream("jdbc.properties"));
Class.forName(props.getProperty("jdbc.driverClass"));
String url = props.getProperty("jdbc.url");
String username = props.getProperty("jdbc.username");
String password = props.getProperty("jdbc.password");
return DriverManager.getConnection(url, username, password);
} public static List<Student> query(String name) throws ClassNotFoundException, IOException, SQLException {
Connection conn = getConnection();
Statement st = conn.createStatement();
String sql = "select * from student where name='" + name + "'";
ResultSet rs = st.executeQuery(sql);
List<Student> list = new ArrayList<Student>();
while (rs.next()) {
int id = rs.getInt("id");
list.add(new Student(id, name));
}
st.close();
conn.close();
return list;
} public static int insert(Student student) throws ClassNotFoundException, IOException, SQLException {
Connection conn = getConnection();
PreparedStatement pstmt = null;
int result = 0;
String sql = "insert into student(id, name) values(?, ?)";
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setInt(1, student.getId());
pstmt.setString(2, student.getName());
result = pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(pstmt!=null)
pstmt.close();
if(conn!=null)
conn.close();
}
return result;
} public static void main(String[] args) throws ClassNotFoundException, IOException, SQLException {
System.out.println("insert " + insert(new Student(1, "Anne")) + " records.");
System.out.println(query("Anne"));
}
}

二、DBCP

JDBC的访问模式存在以下问题:

1. 现在的Web应用经常有几千人同时访问,然而频繁的进行数据库连接操作不仅耗时,还会占用很多的系统资源,导致网站的响应速度下降,严重的甚至会造成服务器的崩溃。
2. 对于每一次数据库连接,使用完后都得断开。如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。
3. 这种开发方式不能控制创建的连接数,系统资源会被毫无顾及的分配出去,连接过多可能导致内存泄漏,服务器崩溃。

  为了解决资源的频繁分配、释放所造成的问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。Java中常用的两个数据库连接池: DBCP和C3P0

导入jar包 commons-dbcp-1.4.jar 和 commons-pool-1.3.jar

a. 直接代码实现

public class ConnectionFactory {
private static final Logger logger = Logger.getLogger(ConnectionFactory.class);
private PoolingDataSource dataSource = null;
private ObjectPool CP =null;
private static ConnectionFactory connectionFactory = new ConnectionFactory(); private ConnectionFactory() {
} public static ConnectionFactory getInstance() {
return connectionFactory;
} private void configure () throws ClassNotFoundException {
try {
Properties props = new Properties();
props.load(new FileInputStream("jdbc.properties"));
Class.forName(props.getProperty("jdbc.driverClass"));
String url = props.getProperty("jdbc.url");
String username = props.getProperty("jdbc.username");
String password = props.getProperty("jdbc.password");
dataSource = setupDataSource(url, username, password);
} catch (IOException e) {
logger.error("ConnectionFactory.configure() error", e);
}
} public synchronized Connection getConnection() throws SQLException{ Connection conn = null;
try {
if (dataSource == null) {
configure();
}
conn = dataSource.getConnection();
} catch (SQLException e) {
logger.error("ConnectionFactory.getConnection() error", e);
throw e;
} catch (ClassNotFoundException e) {
logger.error("ConnectionFactory.getConnection() error", e);
throw new SQLException("Drive Class not found exception."
);
}
return conn;
} public void shutDown () {
try {
logger.info("db connection pool shut down is called");
CP.close();
} catch (Exception e) {
logger.error("db connection pool shut down throws exception");
}
} private PoolingDataSource setupDataSource(String connectURI, String user, String password) { GenericObjectPool.Config config = new GenericObjectPool.Config();
config.maxActive = 150;
config.maxIdle = 100;
config.minIdle = 30;
config.maxWait = 1000; ObjectPool connectionPool = new GenericObjectPool(null, config);
DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI, user, password);
@SuppressWarnings("unused")
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
connectionFactory, connectionPool, null, null, false, true);
PoolingDataSource poolingDataSource = new PoolingDataSource(connectionPool);
CP = connectionPool; return poolingDataSource;
}
}

b. 使用配置文件

driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
url=jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test
username=root
password=root #<!-- 初始化连接 -->
dataSource.initialSize=10
#<!-- 最大空闲连接 -->
dataSource.maxIdle=20
#<!-- 最小空闲连接 -->
dataSource.minIdle=5
#最大连接数量
dataSource.maxActive=50
#是否在自动回收超时连接的时候打印连接的超时错误
dataSource.logAbandoned=true
#是否自动回收超时连接
dataSource.removeAbandoned=true
#超时时间(以秒数为单位)
dataSource.removeAbandonedTimeout=180
#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
dataSource.maxWait=1000
public static DataSource getDataSource () {
DataSource dataSource = null;
try {
Properties props = new Properties();
props.load(DBUtil.class.getResourceAsStream("dbcp.properties"));
dataSource = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
throw new DBException("file not found: dbcp.properties");
}
return dataSource ;
}

三、Spring 

jtds

JPA

Hibernate

参考

http://www.2cto.com/kf/201407/317622.html

java 数据库连接的更多相关文章

  1. Java数据库连接技术——JDBC

    大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...

  2. Java数据库连接池封装与用法

    Java数据库连接池封装与用法 修改于抄袭版本,那货写的有点BUG,两个类,一个用法 ConnectionPool类: package com.vl.sql; import java.sql.Conn ...

  3. Java数据库连接池

    转载过来的,最近在做一个小网站,准备使用这种方法.     Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...

  4. 一个JAVA数据库连接池实现源码

    原文链接:http://www.open-open.com/lib/view/open1410875608164.html // // 一个效果非常不错的JAVA数据库连接池. // from:htt ...

  5. Java数据库连接——JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

  6. Java数据库连接代码集合(转)

    Java数据库连接接口(JDBC)是Java里定义的一套用于数据库连接和操作的API的集合.有不同的数据库厂商提供这套接口的实现类,对于 Java程序员来说,程序员不需要关心数据库的底层的实现,统一的 ...

  7. Sae配置Java数据库连接

    Sae配置Java数据库连接 Sae在Java中配置mysql数据库 >>>>>>>>>>>>>>>>& ...

  8. Java数据库连接池的几种配置方法(以MySQL数据库为例)

    Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...

  9. java数据库连接类,已经把数据库操作的方法都封装好了

    在这里分享一个已经封装好了的java数据库连接类,只要创建对象就可以实现数据库的增删改查操作,用过都说好.其实这个不是我自己写的,是一个理解和学习能力超高的朋友写的,他也很乐于分享交流,本人也深受他的 ...

  10. Java数据库连接--JDBC基础知识(操作数据库:增删改查)

    一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...

随机推荐

  1. css知多少(4)——解读浏览器默认样式(转)

    css知多少(4)——解读浏览器默认样式   上一节<css知多少(3)——样式来源与层叠规则>介绍了样式的五种来源,咱们再通过一张图回顾一下. 对于上面的三层,咱们大概都比较熟悉了.下面 ...

  2. Contset Hunter 1102 高精度求卡特兰数

    用递推的方式写的写挂了,而如果用组合数又不会高精度除法,偶然看到了别人的只用高精度乘低精度求组合数的方法,记录一下 #include<bits/stdc++.h> using namesp ...

  3. Ros学习service——小海龟

    rosservice 服务(services)是节点之间通讯的另一种方式.服务允许节点发送请求(request) 并获得一个响应(response) rosservice list 输出可用服务的信息 ...

  4. Python程序设计5——函数

    本章介绍Python中模块和函数的概念. Python程序是由包.模块和函数三者组成,包是由一系列模块组成的集合,模块是处理某一类问题的函数和类的集合.Python提供的许多工具包和模块安装在Pyth ...

  5. java8的十大新特性

    推荐学习的博客: http://blog.csdn.net/renfufei/article/details/24600507/-------讲解的非常通俗易懂 http://blog.csdn.ne ...

  6. 形式化验证工具(PAT)Perterson Algorithm学习

    今天学习一下Perterson Algorithm. 这个算法是使用三个变量来实现并发程序的互斥性算法. 具体看一下代码: Peterson算法是一个实现互斥锁的并发程序设计算法,核心就是三个标志位是 ...

  7. 自定义MVC的Helper扩展方法 转 Insus.NET

    记得在开发ASP.NET时候,也经常性使用C#可以写自己义的扩展方法,如: http://www.cnblogs.com/insus/p/3154363.html 或http://www.cnblog ...

  8. tftp命令详解

    TFTP协议简介TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现.嵌入式linux的tftp开发环境包括两个方面: 一是linux服务器端的tftp-server支持,二是嵌入式目标 ...

  9. IOC与依赖注入

    spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...

  10. UWP&WP8.1 基础控件——Image

    Image是UWP和WP8.1中系统自带的图片展示器. 具有较强的性能,使用也是非常的简单. 使用方式分为在XAML中,在C#代码中. XAML中: 在XAML中使用方式非常简单. 常用XAML So ...