日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

java連接mysql的線程安全問題

瀏覽:150日期:2022-06-11 11:59:34

問題描述

我在網上搜索了N天,幾乎沒有關于線程安全的解決辦法,同樣的問題Redis就很好解決,改了一個網上找來的工具類,請懂的大神幫我修改一下或者給點指導意見.我現在的想法就是加了synchronized關鍵字,但是總覺得還是有問題,非常感謝!

class MySQLUtil { private static final String driver = 'com.mysql.jdbc.Driver'; private static final String url = 'jdbc:mysql://192.168.31.103:3306/'; private static final String character = '?useUnicode=true&characterEncoding=utf8'; private static final String ssl = '&useSSL=false'; private static final String user = 'root'; private static final String password = '111111'; private static Connection connection = null; private static Statement statement = null; private static PreparedStatement ps = null; private static ResultSet rs = null; boolean TestConnection(String db) { try { Class.forName(driver); Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password); if (!connection.isClosed()) {CloseConnection();return true; } } catch (Exception e) { e.printStackTrace(); } return false; } synchronized private void ConnectToDB(String db) { try { Class.forName(driver); Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password); if (!connection.isClosed()) {statement = connection.createStatement(); } } catch (Exception e) { e.printStackTrace(); } } synchronized private void CloseConnection() { try { if (rs != null) {rs.close(); } } catch (SQLException e) { e.printStackTrace(); }try { if (ps != null) {ps.close(); } } catch (SQLException e) { e.printStackTrace(); }try { if (connection != null) {connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } synchronized void ModifyData(String db, String data) {ConnectToDB(db); try { statement.execute(data); } catch (SQLException e) { e.printStackTrace(); } finally { CloseConnection(); } } synchronized List ReadData(String db, String data) { List<String> list = new ArrayList<>(); int count; ConnectToDB(db);try { rs = statement.executeQuery(data); ResultSetMetaData rsmd; rsmd = rs.getMetaData(); count = rsmd.getColumnCount(); while (rs.next()) {for (int i = 1; i <= count; i++) { String label = rsmd.getColumnLabel(i); list.add(label); String value = rs.getString(i); list.add(value);} } } catch (SQLException e) { e.printStackTrace(); } finally { CloseConnection(); } return list; }}

問題解答

回答1:

為了保證連接間數據獨立(非共享),我猜你想實現連接池

ComboPooledDataSource cpds = new ComboPooledDataSource();cpds.setDriverClass( 'org.postgresql.Driver' );cpds.setJdbcUrl( 'jdbc:postgresql://localhost/testdb' );cpds.setUser('caiyongji');cpds.setPassword('test-password');cpds.setMinPoolSize(5);cpds.setAcquireIncrement(5);cpds.setMaxPoolSize(20);回答2:

稍微修改了下,可能會好一些,建議還是聽上面那哥們的,使用成熟的數據庫連接池,沒必要重復造輪子

使用單例,保證數據庫連接的唯一性

修改synchronized關鍵字的用法,提高效率

增加volatile 關鍵字,提高穩定性

package com.singleton;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * <b>功能:</b><br> * <br> * <b>完整路徑:</b> com.singleton.MySQLUtil <br> * <b>創建日期:</b> 2017年6月15日 上午10:42:49 <br> * * @author pfyangf<br> * @version 1.0 */class MySQLUtil {private MySQLUtil(){}private static volatile Connection connection = null; private static final String driver = 'com.mysql.jdbc.Driver'; private static final String url = 'jdbc:mysql://192.168.31.103:3306/'; private static final String character = '?useUnicode=true&characterEncoding=utf8'; private static final String ssl = '&useSSL=false'; private static final String user = 'axtest'; private static final String password = 'axtest123'; private static Statement statement = null; private static PreparedStatement ps = null; private static ResultSet rs = null;public static void main(String[] args) {/*Connection newConnection;try { newConnection = MySQLUtil.connectToDB('xxx'); System.out.println(newConnection.isClosed());} catch (Exception e) { //TODO 異常處理 e.printStackTrace();}*/try { List<Map<String, Object>> data = MySQLUtil.readData('xxx', 'select now() from dual'); System.out.println(data.toString());} catch (Exception e) { e.printStackTrace();} } boolean TestConnection(String db) {try { Class.forName(driver); Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password); if (!connection.isClosed()) {CloseConnection();return true; }} catch (Exception e) { e.printStackTrace();}return false; } /** * <b>功能:獲取DB連接</b><br> * <br> * @Author:pfyangf , 2017年6月15日 * @param db * @return * @throws Exception Connection **/ public static Connection connectToDB(String db) throws Exception {if(null == connection){ synchronized (MySQLUtil.class) {if(null == connection){ Class.forName(driver); connection = DriverManager.getConnection(url + db + character + ssl, user, password); statement = connection.createStatement();} }}return connection; } private static void CloseConnection() {try { if (rs != null) {rs.close(); }} catch (SQLException e) { e.printStackTrace();}try { if (ps != null) {ps.close(); }} catch (SQLException e) { e.printStackTrace();}try { if (connection != null) {connection.close(); }} catch (SQLException e) { e.printStackTrace();} } public static void ModifyData(String db, String data) throws Exception {connectToDB(db);try { statement.execute(data);} catch (SQLException e) { e.printStackTrace();} finally { CloseConnection();} } public static List<Map<String, Object>> readData(String db, String sql) throws Exception {List<Map<String, Object>> list = new ArrayList<>();int count;connectToDB(db);try { rs = statement.executeQuery(sql); ResultSetMetaData rsmd; rsmd = rs.getMetaData(); count = rsmd.getColumnCount(); while (rs.next()) {Map<String, Object> map = null;for (int i = 1; i <= count; i++) { map = new HashMap<>(); map.put(rsmd.getColumnLabel(i), rs.getString(i)); list.add(map);} }} catch (SQLException e) { e.printStackTrace();} finally { CloseConnection();}return list; }}回答3:

沒必要同步吧, 多個連接也沒關系啊。 數據庫自己有鎖的。你也可以直接用連接池。

回答4:

多謝大家的回答,我把代碼改了一下,請大家幫我看看有沒有問題了,主要是沒做過java,我的處理方式就是:除了常量外,沒有類成員變量,全部用參數和返回值傳遞,所有變量都在方法里申明

class MySQLUtil {private static final String driver = 'com.mysql.jdbc.Driver'; private static final String url = 'jdbc:mysql://192.168.31.103:3306/'; private static final String character = '?useUnicode=true&characterEncoding=utf8'; private static final String ssl = '&useSSL=false'; private static final String user = 'root'; private static final String password = '111111';boolean TestConnection(String db) {try { Class.forName(driver); Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password);if (!connection.isClosed()) {CloseConnection(connection, null);return true; }} catch (Exception e) { e.printStackTrace();}return false; }private List ConnectToDB(String db) {List<Object> list = new ArrayList<>();try { Class.forName(driver); Connection connection = DriverManager.getConnection(url + db + character + ssl, user, password);if (!connection.isClosed()) {Statement statement = connection.createStatement();list.add(1, connection);list.add(2, statement);return list; }} catch (Exception e) { e.printStackTrace();}return list; }private void CloseConnection(Connection connection, ResultSet rs) {try { if (rs != null) {rs.close(); }} catch (SQLException e) { e.printStackTrace();}try { if (connection != null) {connection.close(); }} catch (SQLException e) { e.printStackTrace();} }public void ModifyData(String db, String data) {List list = ConnectToDB(db);Connection connection = (Connection) list.get(1);Statement statement = (Statement) list.get(2);try { statement.execute(data);} catch (SQLException e) { e.printStackTrace();} finally { CloseConnection(connection, null);} }public List ReadData(String db, String data) {List<String> result = new ArrayList<>();ResultSet rs = null;int count;List list1 = ConnectToDB(db);Connection connection = (Connection) list1.get(1);Statement statement = (Statement) list1.get(2);try { rs = statement.executeQuery(data); ResultSetMetaData rsmd; rsmd = rs.getMetaData(); count = rsmd.getColumnCount();while (rs.next()) {for (int i = 1; i <= count; i++) { String label = rsmd.getColumnLabel(i); result.add(label); String value = rs.getString(i); result.add(value);} }} catch (SQLException e) { e.printStackTrace();} finally { CloseConnection(connection, rs);}return result; }}

相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩大片在线| 老司机精品久久| 日韩一区二区三免费高清在线观看 | 中文视频一区| 欧美 日韩 国产一区二区在线视频| 精品亚洲免a| 日韩精品1区2区3区| 性色av一区二区怡红| 亚洲福利久久| 色爱av综合网| 日韩电影免费在线观看| 日韩欧美二区| 婷婷综合六月| 亚洲高清毛片| 国产综合欧美| 日韩一区三区| 亚洲香蕉网站| 成人精品亚洲| 香蕉精品视频在线观看| 久久一区二区三区电影| 激情婷婷欧美| 欧美日韩一区二区综合| 91精品国产福利在线观看麻豆| 中文在线免费视频| 国产精品一国产精品k频道56| 中文无码日韩欧| 亚洲欧美日本国产| 日本午夜精品一区二区三区电影| 日韩av黄色在线| 国产日韩欧美三区| 欧美精品二区| 国产一区二区三区四区二区| 欧美黄色一区| 精品99久久| 五月天av在线| 蜜臀91精品国产高清在线观看 | 亚洲精品护士| 在线国产精品一区| 亚洲黄页一区| 日韩在线观看一区二区| 亚洲精品乱码日韩| 国产探花一区在线观看| 91精品福利观看| 国产乱码精品一区二区三区亚洲人 | 久久久久国产精品一区三寸| 欧美日韩中文一区二区| 日本亚洲欧美天堂免费| 国产亚洲欧美日韩精品一区二区三区 | 香蕉久久久久久| 欧美中文一区| 国产精品网在线观看| 国产一区二区色噜噜| 中文另类视频| 黄色免费成人| 日韩精品福利一区二区三区| 国产激情久久| 香蕉人人精品| 日本一区免费网站| 国产精品v一区二区三区| 国产成人精品亚洲线观看| 香蕉久久99| 日本一区二区三区中文字幕| 国产精品jk白丝蜜臀av小说| 欧美国产美女| 亚洲手机在线| 99国产精品| 国产精品久久久久77777丨| 中文字幕在线高清| 精品欧美激情在线观看| 综合一区二区三区| 欧美激情福利| 久久亚洲专区| 日韩国产在线不卡视频| а√天堂中文在线资源8| 久久久精品网| 日本va欧美va精品发布| 麻豆视频在线观看免费网站黄| 亚洲中午字幕| 久久精品97| 久色成人在线| 日本视频中文字幕一区二区三区| 久久精品不卡| 亚洲18在线| 97精品国产福利一区二区三区| 亚洲精品国产精品粉嫩| 日韩av专区| 婷婷久久免费视频| 午夜久久tv| 精品久久视频| 免费在线欧美视频| а√天堂中文在线资源8| 日韩美女国产精品| 国产亚洲激情| 三级在线看中文字幕完整版| 丁香婷婷久久| 无码日韩精品一区二区免费| 欧美日韩国产v| 国产免费久久| 麻豆成人在线| 在线观看精品| 国产精品s色| 亚洲欧美日韩综合国产aⅴ| 久久只有精品| 亚洲乱码久久| 日韩在线观看不卡| 国产精品乱战久久久| 欧美精品九九| 国产精品主播| 中文字幕一区日韩精品| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲不卡av不卡一区二区| 国产乱码精品一区二区三区四区 | 亚洲欧美网站| 99国产精品自拍| 日韩欧美视频专区| 国产精品丝袜在线播放| 日韩精品一级| 国产视频欧美| 四虎影视精品| 91精品国产调教在线观看| 国产伦理一区| 国产精品nxnn| 国产日韩1区| 日韩黄色av| 亚洲精品动态| 蜜桃视频一区二区三区在线观看| 2023国产精品久久久精品双| 四虎884aa成人精品最新| 97精品国产| 狠狠久久伊人| 精品久久国产一区| 国产亚洲精品美女久久久久久久久久| 精品国模一区二区三区| 精品三级久久久| 国产福利亚洲| 日韩视频1区| 国产精品一区毛片| 在线精品亚洲| 视频一区中文字幕精品| 久久黄色影视| 日韩精品欧美成人高清一区二区| 亚洲尤物av| 久久国产视频网| 精品伊人久久久| 中文在线а√天堂| 一本一道久久a久久精品蜜桃| 麻豆久久精品| 久久国产尿小便嘘嘘| 国内自拍视频一区二区三区| 九色porny丨国产首页在线| 久久久久久免费视频| 美女国产精品| 国产毛片精品久久| 日韩欧美一区二区三区在线观看| 91久久国产| 日韩国产在线观看| 91麻豆国产自产在线观看亚洲| 91九色精品国产一区二区| 亚洲免费专区| 国产精品二区不卡| 在线成人直播| 日韩不卡免费视频| 精品视频一区二区三区四区五区 | 福利一区在线| 婷婷亚洲五月| 日韩av网站在线观看| 97精品视频在线看| 国产精品婷婷| 欧美1区2区3| 亚洲精品在线观看91| 欧美亚洲三区| 婷婷成人在线| 国产精品美女在线观看直播| 香蕉久久精品| 日韩激情av在线| av一区在线| 日本va欧美va精品发布| 日韩av福利| 91精品美女| 99久久婷婷| 国产欧美欧美| 五月天激情综合网| 国产精品视频3p| 久久免费高清| 欧美伊人影院| 亚洲国产日韩欧美在线| 国产精品s色| 六月婷婷一区| 免费观看亚洲| 美美哒免费高清在线观看视频一区二区| 欧美激情网址| 亚洲综合中文| 久久蜜桃资源一区二区老牛| 欧美久久亚洲| 国产精品日本| 日韩欧美一区二区三区在线观看 | 国产精品久久久久久模特 | 日本韩国欧美超级黄在线观看| 日韩不卡一二三区| 日韩午夜电影|