https://blog.csdn.net/m0_37459403/article/details/86501151
參考上文,有兩種方法,一種是自建工具類獲取數據庫連接,另一種是調用配置好的連接池獲取數據庫連接。經測試,後一種方法老是報錯,可能是我哪裏沒有配置好,暫時放棄,選用第一種方法。
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、運行測試
效果如下: