javaweb如何连接数据库:两种实现方案
javaweb如何连接数据库,主流有原生JDBC和数据库连接池两套方案,原生JDBC适合小型测试项目,你需要导入数据库驱动jar包,加载驱动、创建连接、编写SQL、执行语句、关闭资源,每次请求都会新建销毁连接,并发量超过50时性能下滑明显;数据库连接池适合生产项目,复用连接减少开销,常用HikariCP,需要配置连接参数,通过数据源获取连接,适合访问量稳定的线上业务,这套操作面向使用Tomcat服务器、MySQL数据库的开发人员,使用Oracle数据库仅需要替换驱动类与连接地址,该方法不适合高并发集群分布式场景,分布式架构要搭配中间件管理数据库连接。
javaweb数据库驱动配置
你要先下载对应版本的数据库驱动包,MySQL8版本驱动类为com.mysql.cj.jdbc.Driver,MySQL5版本是com.mysql.jdbc.Driver,项目里把jar包放到WEB-INF/lib目录下,Maven项目直接在pom.xml写入驱动依赖。驱动版本要和本地数据库版本匹配,MySQL8必须在连接URL追加时区参数serverTimezone=Asia/Shanghai,缺少该参数会抛出时区异常,编码参数useUnicode=true&characterEncoding=utf8可以解决中文乱码问题。
URL格式固定写法jdbc:mysql://主机地址:端口号/数据库名,本地开发主机写localhost,默认端口3306。
原生JDBC代码编写
你在Servlet或者工具类内编写代码,第一步加载驱动,Class.forName写入驱动全类名,随后调用DriverManager.getConnection传入URL、数据库账号、密码,拿到Connection对象,这个对象代表数据库会话。创建Statement或者PreparedStatement对象,优先选PreparedStatement,它可以预编译SQL,降低SQL注入风险,不要直接拼接字符串生成SQL语句,拼接字符串会让恶意用户输入直接执行数据库语句。执行查询使用executeQuery,返回ResultSet结果集,遍历读取数据,增删改操作调用executeUpdate,返回受影响行数。
资源关闭顺序必须反向,先关闭ResultSet,再关闭Statement,最后关闭Connection,代码要写在finally代码块中,保证无论程序是否报错,资源都能释放。忘记关闭连接会造成数据库连接泄漏,短时间内耗尽数据库可用连接,后续请求无法访问数据库。
数据库连接池配置
| 方案 | 连接创建方式 | 并发性能 | 适用场景 |
|---|---|---|---|
| 原生JDBC | 每次请求新建连接 | 较低,频繁创建销毁开销大 | 学习演示、低访问量小项目 |
| HikariCP连接池 | 预先创建连接放入池子,重复复用 | 较高,减少连接创建开销 | 生产环境、用户访问稳定项目 |
HikariCP是SpringBoot内置的连接池,在javaweb项目中引入对应依赖后,创建HikariConfig对象,填入数据库URL、账号、密码、驱动类,设置最大连接数、最小空闲连接、连接超时时间,再实例化HikariDataSource数据源,后续每次获取连接调用getConnection,用完归还连接池,不需要手动关闭底层数据库连接。最大连接数不要盲目设置过大,数据库本身有最大连接上限,MySQL默认上限151,连接池最大连接数建议小于数据库上限。
连接池核心优势是复用。
异常排查与安全规范
常见报错分为四类,ClassNotFoundException代表驱动包缺失或者版本不匹配,SQLExeption访问被拒绝是账号密码错误,通信异常是数据库服务没有启动或者端口不通,时区报错是URL缺少时区参数。捕获异常时打印完整堆栈信息,方便定位问题,线上环境不要直接把数据库异常信息返回前端页面,会泄露数据库地址和表结构信息。数据库账号密码不要硬编码写在Java代码内,提取到properties配置文件,通过IO读取配置,减少敏感信息暴露风险。
该方法的适用边界是,运行环境需要JDK8及以上版本,Tomcat8.5及以上,数据库允许应用服务器IP访问,数据库防火墙没有拦截3306端口;如果数据库部署在云服务器,需要在云平台安全组开放数据库端口,否则javaweb项目无法建立网络连接。
你完成基础连接之后,可封装DB工具类,把获取连接、关闭资源的代码抽离成静态方法,项目其他位置直接调用,减少重复代码,统一管理数据库参数。工具类内部要做好空值判断,避免空指针异常,每次业务方法只获取单次连接,不要把Connection对象存到成员变量,多线程并发访问Servlet时,会出现连接对象共享,引发数据错乱。
