MySql踩坑總結


衣帶漸寬終不悔,為伊消得人憔悴,眾里尋他千百度,驀然回首,那人卻在燈火闌珊處好通順的句子哈哈

轉了那么多彎,才明白問題就在一個地方。睡覺之前想明白了問題,還是經驗太少。王國維的治學三境界:

昨夜西風凋碧樹,獨上高樓,望盡天涯路

衣帶漸寬終不悔,為伊消得人憔悴

眾里尋他千百度,驀然回首,那人卻在燈火闌珊處

數據源配置的問題

具體可以看 這里

本地連接可以,連接到服務器就是不行,愣是不行。我剛開始以為是“APPARENT DEADLOCK!!!”的問題,各種google方法,試了一遍還是不行。都快絕望了,晚上圖書館也在試還是沒有解決。晚上睡覺的時候突然想起來,我MyEclipse好像屏蔽掉了所有往外的連接,( ̄▽ ̄;),真是搬起石頭砸自己的腳,給自己設置障礙。早上一來,將連接放開,好問題解決。貼一下DBCP數據源的配置

#數據庫驅動
driverClassName=com.mysql.jdbc.Driver
#數據庫連接地址
url=jdbc:mysql://服務器地址:3306/dbWaterColInfo
#用戶名
username=root
#密碼
password=root
 
#連接池的最大數據庫連接數。設為0表示無限制
maxActive=30
#最大空閑數,數據庫連接的最大空閑時間。超過空閑時間,數據庫連
#接將被標記為不可用,然后被釋放。設為0表示無限制
maxIdle=10
#最大建立連接等待時間。如果超過此時間將接到異常。設為-1表示無限制
maxWait=1000
 
#超過removeAbandonedTimeout時間后,是否進 行沒用連接(廢棄)的回收(默認為false,調整為true) 
removeAbandoned=true
#超過時間限制,回收沒有用(廢棄)的連接(默認為 300秒,調整為180)
removeAbandonedTimeout=180
//DBCP管理類,也是從網上找的
package com.kuiblog.utils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.SQLException;
import java.util.Properties;
 
import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DBCPManager {
    private static final Log log = LogFactory.getLog(DBCPManager.class);
    private static final String configFile = "這里替換成你的實際配置文件";
 
    private static DataSource dataSource;
 
    static {
        Properties dbProperties = new Properties();
        try {
            dbProperties.load(DBCPManager.class.getClassLoader()
                    .getResourceAsStream(configFile));
            dataSource = BasicDataSourceFactory.createDataSource(dbProperties);
 
            Connection conn = getConn();
            DatabaseMetaData mdm = conn.getMetaData();
            log.info("Connected to " + mdm.getDatabaseProductName() + " "
                    + mdm.getDatabaseProductVersion());
            if (conn != null) {
                conn.close();
            }
        } catch (Exception e) {
            log.error("初始化連接池失敗:" + e);
        }
    }
 
    private DBCPManager(){
    	
    }
    /**
     * 獲取鏈接,用完后記得關閉
     * 
     * @see {@link DBManager#closeConn(Connection)}
     * @return
     */
    public static final Connection getConn() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            log.error("獲取數據庫連接失敗:" + e);
        }
        return conn;
    }
 
    /**
     * 關閉連接
     * 
     * @param conn
     *            需要關閉的連接
     */
    public static void closeConn(Connection conn) {
        try {
            if (conn != null && !conn.isClosed()) {
                conn.setAutoCommit(true);
                conn.close();
            }
        } catch (SQLException e) {
            log.error("關閉數據庫連接失敗:" + e);
        }
    }
}

使用DBCP需要導入兩個包加一個log包。commons-dbcpcommons-poolcommons-logging

然后就可以放心大膽的使用了

數據庫編碼問題

在出現數據庫編碼問題之前我還遇到了一個小問題,那就是我通過DBUtils操作數據庫,執行SELECT * FROM userInfos_t可以查詢到所有的內容,然后參數化查詢就不行,比如SELECT * FROM userInfos_t WHERE name='張三',但是SELECT * FROM userInfos_t WHERE id =2卻可以,也是百思不得解,好吧。也是數據庫編碼的問題。雖然我在Navicat for mysql中看到的是'張三',但數據庫編碼方式並不是UTF8,所以我搜索是搜索不出來的。


  1. 首先查看數據庫的字符集
show variables like 'collation_%';

這是我修改之后的,原先的都是latin1

  1. 網上提到了很多解決方法,一定要仔細看。

    我的Mysql版本是5.7,做了如下修改成功了

    修改/etc/mysql/my.cnf

    [client]
    default-character-set=utf8
    [mysqld]
    default-storage-engine=INNODB
    character-set-server=utf8
    collation-server=utf8_general_ci
    

    怎么找my.cnf

    locate my.cnf
    //如果找不到的話
    updatedb,//然后在查找
    

    重啟Mysql服務

    service mysqld restart
    

    也可以查看這篇文章

    來解決

    總結

    暫時的問題就這樣多,用了DBUtil,沒有用Hibernate,等以后學習學習再用。


### 文章首發於kuiblog.com。加油


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM