https://blog.csdn.net/m0_37459403/article/details/86501151
参考上文,有两种方法,一种是自建工具类获取数据库连接,另一种是调用配置好的连接池获取数据库连接。经测试,后一种方法老是报错,可能是我哪里没有配置好,暂时放弃,选用第一种方法。
【关键点: 两个工具类 + POM.xml】
1、创建读取数据库 properties配置 的 工具类
为了使用项目中统一的数据库配置文件,创建工具类来读取,这样配置和使用分离,便于管理和修改配置。
参考:java读取properties的工具类PropertiesUtil
/**
* 说明:获取 classPath 下的 .properies 配置文件信息
*/
public class PropertiesUtil {
private String properiesName = "";
public PropertiesUtil() {
}
public PropertiesUtil(String fileName) {
this.properiesName = fileName;
}
//使用时,调用这个即可
public Properties getProperties() {
Properties p = new Properties();
InputStream in = null;
try {
in = PropertiesUtil.class.getClassLoader().getResourceAsStream(properiesName);
p.load(in);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return p;
}
//调用Demo 注:我的MySQL配置文件为:dbconfig.properties
// Properties p = new PropertiesUtil("dbconfig.properties").getProperties();
// String value = p.getProperty("driverClassName");
// System.out.println(value);
// public String readProperty(String key) {
// String value = "";
// InputStream in = null;
// try {
// in = PropertiesUtil.class.getClassLoader().getResourceAsStream(properiesName);
// Properties p = new Properties();
// p.load(in);
// value = p.getProperty(key);
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// try {
// in.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// return value;
// }
}
2、添加POM依赖
<!--log4j2连接数据库时需要使用到的包 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.0</version>
</dependency>
2、创建数据库连接类
参考:除了本文顶部的参考文章,还参考了以下两篇:
http://logging.apache.org/log4j/2.0/manual/appenders.html 【官网】
org.apache.commons.dbcp2.PoolableConnection Example 【org.apache.commons.dbcp2 的使用】
注:官网给出的 ConnectionFactory 示例用的是 org.apache.commons.dbcp 和 org.apache.commons.pool 的1版本,百度搜了一下,目前主流都用的 2.X版本了,所以 POM 依赖升级为版本2 。带来的麻烦是官网 ConnectionFactory 中的一些代码用不了,需要更改成版本2的用法,经苦苦搜索找到了 “org.apache.commons.dbcp2 的使用” 这篇参考文章,依葫芦画瓢最终试验成功。
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import java.util.Properties;
import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
import org.apache.commons.dbcp2.PoolableConnection;
import org.apache.commons.dbcp2.PoolableConnectionFactory;
import org.apache.commons.dbcp2.PoolingDataSource;
import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;
public class ConnectionFactory {
private static interface Singleton {
final ConnectionFactory INSTANCE = new ConnectionFactory();
}
private final DataSource dataSource;
private ConnectionFactory() {
Properties prop = new PropertiesUtil("dbconfig.properties").getProperties();
Properties properties = new Properties();
properties.setProperty("user", prop.getProperty("username"));
properties.setProperty("password", prop.getProperty("password")); // or get properties from some configuration file
try
{
Class.forName("com.mysql.jdbc.Driver");
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
System.exit(0);
}
DriverManagerConnectionFactory connectionFactory = new DriverManagerConnectionFactory(prop.getProperty("url"), properties);
PoolableConnectionFactory poolfactory = new PoolableConnectionFactory(connectionFactory, null);
ObjectPool<PoolableConnection> connectionPool = new GenericObjectPool<PoolableConnection>(poolfactory);
this.dataSource = new PoolingDataSource<PoolableConnection>(connectionPool);
}
public static Connection getDatabaseConnection() throws SQLException {
return Singleton.INSTANCE.dataSource.getConnection();
}
}
上面的类中用到了数据库配置文件中的 3 个值,这里补充一下我的配置文件中这3个值的写法:
url:jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8
username:root
password:root
3、配置 log4j2.xml
(1)、首先新建一个日志表 test_log
包含 3 个字段 id,msg,createtime
DROP TABLE IF EXISTS `test_log`;
CREATE TABLE `test_log` (
`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`msg` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '日志信息',
`createtime` datetime(0) NOT NULL COMMENT '日志生成时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
(2)、log4j2.xml 添加 JDBC Appender
<JDBC name="DBLog" tableName="test_log">
<ConnectionFactory class="com.*.ConnectionFactory" method="getDatabaseConnection" />
<Column name="id" pattern="%X{id}" />
<Column name="msg" pattern="%m" />
<Column name="createtime" pattern="%d{yyyy-MM-dd HH:mm:ss}" />
</JDBC>
(3)、log4j2.xml 添加 Logger 并使用 JDBC Appender
<logger name="DBLog" level="INFO" additivity="false">
<appender-ref ref="DBLog"/>
</logger>
4、程序中使用 Logger
为了方便测试,这里使用了Spring管理的定时任务,每2秒新增一条日志
public Logger loggerDB = LoggerFactory.getLogger("DBLog");
@Scheduled(cron="0/2 * * * * ? ") //每2秒执行一次
public void testLogDB() {
MDC.put("id", UuidUtil.get32UUID());
loggerDB.info("testLogDB");
System.out.println("testLogDB");
}
5、运行测试
效果如下: