由于基于Http协议的web程序是无状态的,因此在应用程序中使用JDBC时,每次处理客户端请求都会重建数据库连接,如果客户端的请求频繁,将会消耗非常多的资源,因此tomcat服务器提供了一种数据库连接优化技术–数据库连接池技术,连接池负责分配、管理和释放数据库的连接,它允许应用程序重复使用一个现有的连接,而不需要重新创建一个新的连接。在使用完一个连接之后将连接归还数据库连接池,以备其他请求使用。
配置局部数据库连接池
打开Web工程的META-INF文件夹,在其内部创建一个名称为context.xml的配置文件,并写入如下的配置:
<Context path="/ServletDemo" docBase="ServletDemo" debug="1"> <Resource name="jdbc/ServletdemoDbRC" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/servletdemo?characterEncoding=utf8" username="root" password="123456" maxActive="500" maxIdle="50" maxWait="3000"/> </Context>
其中ServletDemo表示的是Web工程目录,ServletdemoDbRC是这个资源的名称,在代码中使用此名称可以获取到相关的连接。url中的servletdemo是相关的数据库名称,username和password是数据库的用户名称和密码,maxActive表示连接池中最大的连接数,maxIdle表示最大的空闲连接数,maxWait表示等待连接的最大时间(毫秒)。
获取连接代码
上述配置完成之后在Servlet中使用如下的代码可以获取到连接。
PrintWriter out = response.getWriter(); response.setContentType("text/html;charset=UTF-8"); try{ javax.naming.Context ctx = new javax.naming.InitialContext(); //使用资源的名称进行引用[ServletdemoDbRC] javax.sql.DataSource ds = (javax.sql.DataSource)ctx.lookup("java:/comp/env/jdbc/ServletdemoDbRC"); //获取到连接 Connection conn = ds.getConnection(); //简单的数据库查询 PreparedStatement pstmt = conn.prepareStatement("select * from test"); ResultSet RS = pstmt.executeQuery(); while(RS.next()){ out.print(RS.getString("id")+"<br>"); } pstmt.close(); }catch(Exception e){ out.println(e.getMessage()); }
上面的代码是在doGet中的一个测试,其中test是一个只有字段id的表,执行上述的Servlet结果如下图所示: