简述
JDBC,英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。可以用JAVA来写不同类型的可执行文件:JAVA应用程序、JAVA Applets、Java Servlet、JSP等,不同的可执行文件都能通过JDBC访问数据库,又兼备存储的优势。简单说它就是JAVA与数据库的连接的桥梁或者插件,用JAVA代码就能操作数据库的增删改查、存储过程、事务等。
JDBC api 简述
JDBC标准主要提供一套api规范,第三方应用通过实现JDBC的接口并提供一个jar包给应用程序调用,架构如下图
-
其中DriverManager负责加载各种不同驱动程序(Driver),并根据不同的请求,向调用者返回相应的数据库连接(Connection)。
-
第三方数据库中间件需要实现Driver接口提供给DriverManager
-
应用程序通过调用JDBC API 来实现对数据库的操作,第三方数据库需要提供各自api的实现,其中主要包括:
Connection:数据库连接,负责进行与数据库间的通讯,SQL执行以及事务处理都是在某个特定Connection环境中进行的。可以产生用以执行SQL的Statement。
Statement:用以执行SQL查询和更新(针对静态SQL语句和单次执行)。
JDBC把对数据库的操作抽象出来,把建立数据库连接的行为聚合到Connection接口,对数据库操作的行为聚合到Statement接口中。
比如调用mysql提供的mysql-conector-java.jar进行查询:
public class MysqlJdbcTest {
@Test
public void jdbcQuery() throws Exception {
PooledDataSource ds = new PooledDataSource ();
// 设置mysql driver
ds.setDriver ("com.mysql.jdbc.Driver");
// 设置数据库url
ds.setUrl ("jdbc:mysql://localhost:3306/test");
ds.setUsername ("root");
ds.setPassword ("root");
// 获取一个Connection
Connection con = ds.getConnection ();
// 执行查询
exexuteQuery (con);
con.close ();
}
private static ResultSet exexuteQuery(Connection con) throws SQLException {
PreparedStatement st = con.prepareStatement ("select * from udp_record");
ResultSet rs = st.executeQuery ();
return rs;
}
}
建立数据库连接connection
使用wireshark试着抓一个本地的包来看一下这个调用过程,可以看到底层通过TCP协议+mysql二进制协议来执行,具体过程如下:
-
首先进行三次握手
-
接着发送一个Login Request
-
返回OK后进行query请求,看到一个query执行了7次request请求
-
最后使用con.close()方法关闭连接,发送一个RST 信号给服务器来中断连接
统计一下这条查询语句的时间为5.657848-5.496280=0.161568秒,如果使用一个线程来执行sql语句,假设2W日活,单用户单日平均执行10次查询,那么调用时间居然为9.976小时。如果使用多线程可以显著提高性能,同时使用线程池技术,来保证资源的合理利用。