一、tomcat设置连接池
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup(“java:comp/env/jdbc/bookstore”);
conn = ds.getConnection();
使用连接池,查询数据的方式。
servlet
package servletjdbc;
import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
import java.sql.*;
import java.util.ArrayList;
import javax.sql.*;
import javax.naming.*;
public class GetDBInfoServlet2 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/bookstore");
conn = ds.getConnection();
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<html><head>");
out.println("<title>数据库表的信息</title>");
out.println("</head><body>");
String tableName = req.getParameter("tableName");
if (null == tableName || tableName.equals("")) {
DatabaseMetaData dbMeta = conn.getMetaData();
rs = dbMeta.getTables(null, null, null, new String[]{"TABLE"});
out.println("<form action=\"getdbinfo\" method=\"get\">");
out.println("<select size=1 name=tableName>");
while (rs.next()) {
out.println("<option value=" + rs.getString("TABLE_NAME") + ">");
out.println(rs.getString("TABLE_NAME"));
out.println("</option>");
}
out.println("</select><p>");
out.println("<input type=\"submit\" value=\"提交\">");
out.println("</form>");
} else {
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from " + tableName);
ResultSetMetaData rsMeta = rs.getMetaData();
int columnCount = rsMeta.getColumnCount();
out.println("<table border=1>");
out.println("<caption>表的结构</catption>");
out.println("<tr><th>字段名</th><th>字段类型</th><th>最大字符宽度</th></tr>");
ArrayList<String> al = new ArrayList<String>();
for (int i = 1; i <= columnCount; i++) {
out.println("<tr>");
String columnName = rsMeta.getColumnName(i);
out.println("<td>" + columnName + "</td>");
al.add(columnName);
out.println("<td>" + rsMeta.getColumnTypeName(i) + "</td>");
out.println("<td>" + rsMeta.getColumnDisplaySize(i) + "</td>");
}
out.println("</table><p>");
out.println("<table border=1>");
out.println("<caption>表中的数据</catption>");
out.println("<tr>");
for (int i = 0; i < columnCount; i++) {
out.println("<th>" + al.get(i) + "</th>");
}
while (rs.next()) {
out.println("<tr>");
for (int i = 1; i <= columnCount; i++) {
out.println("<td>" + rs.getString(i) + "</td>");
}
out.println("</tr>");
}
out.println("</table>");
}
out.println("</body><html>");
out.close();
} catch (NamingException ne) {
ne.printStackTrace();
} catch (SQLException se) {
se.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException se) {
se.printStackTrace();
}
rs = null;
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException se) {
se.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
conn = null;
}
}
}
}
web.xml
<servlet>
<servlet-name>GetDBInfoServlet2</servlet-name>
<servlet-class>servletjdbc.GetDBInfoServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GetDBInfoServlet2</servlet-name>
<url-pattern>/getdbinfo2</url-pattern>
</servlet-mapping>
tomcat的context.xml
<!--配置mysql数据库的连接池,
需要做的额外步骤是将mysql的Java驱动类放到tomcat的lib目录下
maxIdle 连接池中最多可空闲maxIdle个连接
minIdle 连接池中最少空闲maxIdle个连接
initialSize 初始化连接数目
maxWait 连接池中连接用完时,新的请求等待时间,毫秒
username 数据库用户名
password 数据库密码
-->
<Resource name="jdbc/bookstore"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
maxIdle="30"
maxWait="10000"
maxActive="100"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/bookstore?serverTimezone=UTC&useSSL=false" />
二、小记
不积跬步,无以至千里;不积小流,无以成江海。频繁创建关闭链接消耗时间,线程池创建一定数量的链接,用完不立即销毁,设置一定的数值用来复用,提高效率。
三、引用、参考
[1]https://www.cnblogs.com/jay36/p/7684000.html