|
JSP连数据库,接数据库最省事的接数据库做法就是把JDBC驱动扔进WEB-INF/lib,然后直接在JSP页面里写Java代码。接数据库对,接数据库就是接数据库那种<% %>脚本块里写Class.forName、DriverManager.getConnection。接数据库能跑,接数据库但丑。接数据库我见过不少老项目就这么干,接数据库一个index.jsp开头先连数据库查用户信息,接数据库页面顶部飘着一排Java异常堆栈。接数据库能用,接数据库但每次改数据库密码得翻遍所有JSP文件。接数据库 先把这个最直接的接数据库方式说清楚。假设你用的接数据库是MySQL 8,驱动包是mysql-connector-j-8.x.jar。放到WebContent/WEB-INF/lib下面,Tomcat启动时会自动加载。然后在JSP里这么写: <%@ page import="java.sql.*" %> <% Connection conn = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai"; conn = DriverManager.getConnection(url, "root", "123456"); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT username FROM users"); while(rs.next()) { out.println(rs.getString("username") + "<br>"); } } catch(Exception e) { e.printStackTrace(); } finally { if(conn != null) conn.close(); } %> 这段代码能跑通,但有几个坑我踩过。MySQL 8的驱动类名从com.mysql.jdbc.Driver变成了com.mysql.cj.jdbc.Driver,写错了报ClassNotFoundException。URL里不加serverTimezone参数,控制台会刷一堆时区警告。还有useSSL=false,本地开发不关掉SSL握手会慢得让你怀疑人生。 把数据库连接写在JSP里,最要命的问题是连接没法复用。每次请求都新建一个Connection,用完关掉。并发一上来,数据库连接数直接爆掉。我有次压测一个老系统,200个并发用户,MySQL的max_connections设的500,结果Tomcat日志里全是"Too many connections"。后来改成在ServletContextListener里初始化一个DataSource,整个应用共享连接池,问题才解决。 连接池的配置放在context.xml或者web.xml里更合理。比如用Tomcat自带的JDBC Realm或者DBCP: <Context> <Resource name="jdbc/testdb" auth="Container" type="javax.sql.DataSource" maxTotal="20" maxIdle="10" maxWaitMillis="10000" username="root" password="123456" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=Asia/Shanghai"/> </Context> 然后在JSP里通过JNDI查找: InitialContext ctx = new InitialContext(); DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/testdb"); Connection conn = ds.getConnection(); 这样连接从池子里拿,用完close()实际上是还给池子,不是真关闭。性能提升很明显。我测过同一个查询,直连方式平均响应时间80ms,连接池方式降到12ms左右。差距主要花在TCP握手和MySQL认证上。 不过说实话,现在新项目没人往JSP里写JDBC代码了。JSP本身就不该承担业务逻辑,它只负责展示。数据库操作应该封装在DAO层或者用MyBatis、Hibernate这类框架。JSP页面里最多用JSTL标签遍历一下后端传过来的List。我维护过一个2010年的老系统,一个showUser.jsp文件里混了300多行Java代码加HTML,改个字段名要在三个地方同步修改,每次改完都提心吊胆。 如果非要在JSP里连数据库,至少把连接获取和释放封装成一个工具类。比如写个DBUtil.getConnection(),内部用ThreadLocal管理连接,或者干脆用连接池。别在每个JSP里重复写DriverManager那一套。另外记得在web.xml里配好错误页面,数据库连不上时别把原始异常直接吐给用户看——那玩意暴露数据库地址和端口,不安全。 最后提一句,Tomcat 10之后包名从javax.servlet变成了jakarta.servlet,JSP里import的包也要跟着改。我上次把一个老项目从Tomcat 9迁到10,光是改import就花了半小时。数据库驱动倒是没变,还是那些jar包。 |