java 数据库连接
一、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 数据库连接的更多相关文章
- Java数据库连接技术——JDBC
大家好,今天我们学习了Java如何连接数据库.之前学过.net语言的数据库操作,感觉就是一通百通,大同小异. JDBC是Java数据库连接技术的简称,提供连接各种常用数据库的能力. JDBC API ...
- Java数据库连接池封装与用法
Java数据库连接池封装与用法 修改于抄袭版本,那货写的有点BUG,两个类,一个用法 ConnectionPool类: package com.vl.sql; import java.sql.Conn ...
- Java数据库连接池
转载过来的,最近在做一个小网站,准备使用这种方法. Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...
- 一个JAVA数据库连接池实现源码
原文链接:http://www.open-open.com/lib/view/open1410875608164.html // // 一个效果非常不错的JAVA数据库连接池. // from:htt ...
- Java数据库连接——JDBC基础知识(操作数据库:增删改查)
一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...
- Java数据库连接代码集合(转)
Java数据库连接接口(JDBC)是Java里定义的一套用于数据库连接和操作的API的集合.有不同的数据库厂商提供这套接口的实现类,对于 Java程序员来说,程序员不需要关心数据库的底层的实现,统一的 ...
- Sae配置Java数据库连接
Sae配置Java数据库连接 Sae在Java中配置mysql数据库 >>>>>>>>>>>>>>>>& ...
- Java数据库连接池的几种配置方法(以MySQL数据库为例)
Java数据库连接池的几种配置方法(以MySQL数据库为例) 一.Tomcat配置数据源: 前提:需要将连接MySQL数据库驱动jar包放进Tomcat安装目录中common文件夹下的lib目录中 1 ...
- java数据库连接类,已经把数据库操作的方法都封装好了
在这里分享一个已经封装好了的java数据库连接类,只要创建对象就可以实现数据库的增删改查操作,用过都说好.其实这个不是我自己写的,是一个理解和学习能力超高的朋友写的,他也很乐于分享交流,本人也深受他的 ...
- Java数据库连接--JDBC基础知识(操作数据库:增删改查)
一.JDBC简介 JDBC是连接java应用程序和数据库之间的桥梁. 什么是JDBC? Java语言访问数据库的一种规范,是一套API. JDBC (Java Database Connectivit ...
随机推荐
- IDEA创建MAVEN 无骨架WEB 项目
Idea创建maven带有骨架的web项目的时候,会缺少必要文件夹,而且会多出来一些我们不需要的东西 详见:IDEA创建Maven Web项目 所以我们也可以创建无骨架项目: 创建maven项目 不选 ...
- 修改Win10默认窗口背景色为护眼色的方法
按Windows键+R,打开“运行”对话框,输入regedit: 修改[HKEY_CURRENT_USER\Control Panel\Colors]下Windows键值为 199 237 204, ...
- Codeforces 1076E Vasya and a Tree(树状数组)或dfs
题意:给你一颗以1为根节点的树,初始所有节点的权值为0,然后有m个操作,每个操作将点x的所有距离不超过d的节点权值+1,问经过m次操作后每个节点权值是多少? 思路:如果是一个序列,就可以直接用树状数组 ...
- php中定义数组的方法
1.PHP定义数组的格式 数组名=array(); 如:$aa=array();//这样就定义了一个数组, 之后给元素赋值: $aa[0]="9016"; $aa[1]=" ...
- winform 对话框控件
ColorDialog 可以调节颜色的控件,如果给一个按钮点击事件 ColorDialog.showdialog();就会弹出这个 返回值是个枚举类 然后定义一个这个类的变量 接收一下它的返回值 Di ...
- 612D The Union of k-Segments
传送门 题目大意 给定n个区间,问你被覆盖至少k次的区间(两端连续区间可以合并)最少有多少个,并输出. 分析 大水题呀QwQ,只需要将每个点的位置及它是左端点还是右端点这两个信息存起来然后进行一些简单 ...
- zookeeper集群安装(转)
转载地址:http://www.blogjava.net/hello-yun/archive/2012/05/03/377250.html 本方法,本人亲自试验,可以成功. ZooKeeper是一个分 ...
- java全栈day07---Eclipse开发工具 超市库存管理系统
前六天我们都是用Notepad++来编写java程序,通过DOS命令来运行,我们发现这样比较繁琐,那么我们今天就用一个工具Eclipse来开发java Eclipse的下载安装 * A: Eclips ...
- winFrom程序更新自动安装
我就以一个计算字符长度的程序为例子吧界面如下 代码如下 [C#] 纯文本查看 复制代码 ? 01 02 03 04 private void button1_Click(object sender, ...
- sql 语言练习题
1. 查询Student表中的所有记录的Sname.Ssex和Class列. 2. 查询教师所有的单位即不重复的Depart列. 3. 查询Student表的所有记录 . 4. 查询Score表中成绩 ...