1. 数据库连接池是什么意思?
数据库连接池(Database Connection Pool)是一种管理和复用数据库连接的技术。它的核心思想是预先创建一组数据库连接,存放在一个"池子"中,应用程序需要连接数据库时从池中获取,使用完毕后归还,而不是每次都创建和销毁连接。
为什么需要连接池?
- 创建和关闭数据库连接是昂贵的操作,涉及网络通信和资源分配。
- 连接池通过复用连接减少了性能开销,提高了系统效率。
工作原理:
- 初始化时创建一定数量的连接(最小连接数)。
- 应用请求时从池中分配空闲连接。
- 使用完后归还给池子,而不是关闭。
- 如果连接不够,可以动态扩展(不超过最大连接数)。
常见实现: HikariCP、Apache DBCP、C3P0 等。
2. 什么是JDO,分析原理
JDO(Java Data Objects) 是一种Java持久化技术,用于将Java对象映射到数据库中,属于对象-关系映射(ORM)的一种标准(JSR-12、JSR-243)。它允许开发者以面向对象的方式操作数据库,而无需直接编写SQL。
原理分析:
- 对象持久化: JDO通过定义"持久化类"(Persistent Class),将Java对象状态保存到数据库。开发者只需操作对象,JDO负责将其转换为数据库操作。
- JDO实现: 依赖JDO提供者(如DataNucleus),通过元数据(XML或注解)描述对象与数据库的映射关系。
- 运行时管理: JDO使用PersistenceManager管理对象生命周期,包括增删改查(CRUD)。
- 透明性: JDO屏蔽了底层数据库细节,支持多种数据库(如MySQL、Oracle)。
与JPA区别: JPA(Java Persistence API)是后来的标准,吸收了JDO的优点,应用更广泛,而JDO如今较少使用。
3. 列出Java应该遵循的JDBC最佳实践
JDBC(Java Database Connectivity)是Java操作关系型数据库的标准API。以下是使用JDBC的最佳实践:
- 使用数据库连接池: 避免频繁创建/关闭连接,使用HikariCP等连接池提升性能。
- 及时关闭资源: 使用try-with-resources确保Connection、Statement、ResultSet被正确关闭,避免资源泄漏。
- 预编译SQL: 使用PreparedStatement替代Statement,提升性能并防止SQL注入。
- 批量处理: 对于大量数据操作,使用addBatch()和executeBatch()提高效率。
- 异常处理: 捕获SQLException并妥善处理,提供有意义的错误日志。
- 参数化查询: 使用占位符(?)传递参数,而不是拼接SQL字符串。
- 选择合适的驱动: 根据数据库版本选择匹配的JDBC驱动。
- 事务管理: 合理使用commit()和rollback(),必要时关闭自动提交(setAutoCommit(false))。
4. JDBC如何连接数据库
JDBC连接数据库的基本步骤如下:
-
加载JDBC驱动:
javaClass.forName("com.mysql.cj.jdbc.Driver"); // 以MySQL为例
(新版驱动可省略此步,自动加载)
-
建立连接:
javaString url = "jdbc:mysql://localhost:3306/mydb?useSSL=false"; String username = "root"; String password = "password"; Connection conn = DriverManager.getConnection(url, username, password);
-
创建Statement或PreparedStatement:
javaStatement stmt = conn.createStatement(); // 或 PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
-
执行SQL:
javaResultSet rs = stmt.executeQuery("SELECT * FROM users"); // 或 pstmt.setInt(1, 1); ResultSet rs = pstmt.executeQuery();
-
处理结果:
javawhile (rs.next()) { System.out.println(rs.getString("name")); }
-
关闭资源:
javars.close(); stmt.close(); conn.close();
推荐使用try-with-resources自动关闭。
5. JDBC怎么处理事务?
JDBC通过Connection对象管理事务,步骤如下:
-
关闭自动提交:
javaconn.setAutoCommit(false);
-
执行多个操作:
javaStatement stmt = conn.createStatement(); stmt.executeUpdate("INSERT INTO users (name) VALUES ('Alice')"); stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE user_id = 1");
-
提交事务:
javaconn.commit();
-
异常回滚:
javatry { // 事务操作 conn.commit(); } catch (SQLException e) { conn.rollback(); // 回滚 e.printStackTrace(); } finally { conn.setAutoCommit(true); // 恢复自动提交 conn.close(); }
注意: 事务操作应放在try-catch中,确保异常时回滚,避免数据不一致。
6. 如何实现Java程序和JDBC驱动的松耦合?
松耦合指的是Java程序不直接依赖具体的JDBC驱动实现,解耦应用程序与数据库驱动的具体实现。实现方法如下:
-
使用DriverManager:
- 通过DriverManager.getConnection()动态加载驱动,避免硬编码特定驱动类。
- 驱动类名(如"com.mysql.cj.jdbc.Driver")可通过配置文件(如properties文件)传入。
-
依赖注入:
- 使用Spring等框架,通过依赖注入(如DataSource)提供数据库连接,屏蔽底层驱动细节。
java@Autowired private DataSource dataSource; Connection conn = dataSource.getConnection();
-
抽象工厂模式:
- 定义接口(如DatabaseConnectionFactory),实现类根据配置返回不同数据库的连接。
javapublic interface DatabaseConnectionFactory { Connection createConnection(); }
-
配置文件管理:
- 将URL、驱动类名、用户名、密码等放入外部配置文件(如JDBC.properties),程序通过加载配置动态连接。
-
使用JNDI(可选):
- 在应用服务器(如Tomcat)中配置数据源,通过JNDI查找连接,程序无需关心驱动实现。
优点: 切换数据库(如MySQL到PostgreSQL)时,只需修改配置,无需改动代码。