本文目錄一覽:
- 1、java怎麼連接mysql資料庫
- 2、如何用java開啟mysql事務,要求詳細
- 3、JAVA連mysql
- 4、如何用java 5分鐘實現一個最簡單的mysql代理伺服器
- 5、java中怎麼連接mysql資料庫
java怎麼連接mysql資料庫
java 連接 mysql 和連接oracle 是相同的
第一步 配置驅動
第二步 配置資料庫服務地址默認埠 3306
第三步 打開連接(配置用戶和密碼)
具體代碼如下:
String url = “jdbc:mysql://localhost:3306/javademo?user=rootpassword=rootuseUnicode=truecharacterEncoding=UTF8”;
Class.forName(“com.mysql.jdbc.Driver”);// 動態載入mysql驅動
conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
如何用java開啟mysql事務,要求詳細
看你是什麼事務,jdbc事務,還是分散式事務,還是容器事務
1,編程式事務管理(jdbc的事務是綁定在connection上的)
Connection conn = null;
try
{
Class.forName(“com.mysql.jdbc.Driver”);
conn = DriverManager.getConnection(“jdbc:oracle:thin:@host:1521:SID”,”username”,”password”);
conn.setAutoCommit(false); //取消自動提交
PreparedStatement ps = conn.prepareCall(“update something”);
ResultSet rs = ps.executeQuery();
conn.commit(); //手動提交
}
catch (Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
conn.close();
}
2,聲明式事務
先在工程的application.xml配置文件中添加如下代碼,開啟事務
!– 聲明式事務控制配置 —
tx:annotation-driven transaction-manager=”txManager”/
bean id=”txManager” class=”org.springframework.jdbc.datasource.DataSourceTransactionManager”
property name=”datasource” ref=”bassDataSource”/property
/bean
然後在你需要開啟事務的介面前面添加註解
@Transactional(rollbackFor = IOException.class)
public void add(String name) throws IOException
{
System.out.println(“可以再類里和方法裡面添加事務註解0~0”);
throw new IOException();
}
直接調用介面方法就好
分散式事務處理(mysql貌似在5.X之後才支持) 的話,
1.可以直接使用spring+atomikos框架進行管理
參考:
就不貼測試代碼了,自己看著配置吧
2,使用JTA(Java Transaction API)進行分散式事務管理(測試代碼如下)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//分散式事務處理
public class transferAccount
{
@SuppressWarnings(“null”)
public void testTransferAccount()
{
JAVA連mysql
查看了Mysql的文檔,以及Connector/J的文檔以及在線說明發現,出現這種異常的原因是:Mysql伺服器默認的「wait_timeout」是8小時,也就是說一個connection空閑超過8個小時,Mysql將自動斷開該 connection。這就是問題的所在,在C3P0 pools中的connections如果空閑超過8小時,Mysql將其斷開,而C3P0並不知道該connection已經失效,如果這時有 Client請求connection,C3P0將該失效的Connection提供給Client,將會造成上面的異常。
上網搜索,在MySQL的論壇上找到一個辦法,就是如果在執行sql語句的時候發生了上述異常,就將sql語句重新執行一次。
試驗發現,這個辦法對這個使用spring+hibernate的服務無效。
進一步搜索發現,MySQL官方不推薦使用autoReconnect=true,參見
需要另外找別的辦法來解決這個問題。
由於問題產生的根本原因在於服務到資料庫的連接長時間沒活動,既然重新連接的辦法無效,就可以嘗試另外一種辦法,就是反空閑。
自己寫一個線程來反空閑的話,比較麻煩。
最後在網上找到一個辦法。為hibernate配置連接池,推薦用c3p0,然後配置c3p0的反空閑設置idle_test_period,只要小於MySQL的wait timeout即可。
在hibernate.cfg.xml中增加下面幾項:
!– configuration pool via c3p0–
property name=”hibernate.connection.provider_class”org.hibernate.connection.C3P0ConnectionProvider/property
property name=”c3p0.min_size”5/property
property name=”c3p0.max_size”30/property
property name=”c3p0.time_out”1800/property !– seconds –!– default: 0 —
property name=”c3p0.max_statement”50/property !– default: 0 —
property name=”c3p0.acquire_increment”1/property !– default: 1 —
property name=”c3p0.idle_test_period”120/property !– seconds –!– default: 0 —
property name=”c3p0.validate”true/property
修改完後測試,問題解決。
——————————————————–
DBCP連接池說明:
driverClassName
url
username
password
上面四個分別是驅動,連接字元串,用戶名和密碼
maxActive 連接池支持的最大連接數
maxIdle 連接池中最多可空閑maxIdle個連接
minIdle 連接池中最少空閑maxIdle個連接
initialSize 初始化連接數目
maxWait 連接池中連接用完時,新的請求等待時間,毫秒
timeBetweenEvictionRunsMillis timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis一起使用,每
timeBetweenEvictionRunsMillis毫秒秒檢查一次連接池中空閑的連接,把空閑時間超過minEvictableIdleTimeMillis毫秒的連接斷開,直到連接池中的連接數到minIdle為止
minEvictableIdleTimeMillis 連接池中連接可空閑的時間,毫秒
removeAbandoned true,false,是否清理removeAbandonedTimeout秒沒有使用的活動連接,清理後並沒有放回連接池
removeAbandonedTimeout 活動連接的最大空閑時間
logAbandoned true,false,連接池收回空閑的活動連接時是否列印消息
minEvictableIdleTimeMillis,removeAbandonedTimeout這兩個參數針對的連接對象不一樣,minEvictableIdleTimeMillis針對連接池中的連接對象,removeAbandonedTimeout針對未被close的活動連接.
c3p0連接池說明:
driverClass
jdbcUrl
user
password
minPoolSize
maxPoolSize
initialPoolSize
acquireIncrement 池中沒有空閑連接時,一次請求獲取的連接數
maxIdleTime 池中連接最大空閑時間
acquireRetryAttempts 獲取連接失敗後,重新嘗試的次數
acquireRetryDelay 嘗試連接間隔時間,毫秒
checkoutTimeout 等待連接時間,0為無限等待,毫秒
DebugUnreturnedConnectionStackTraces true,false,是否收回未返回的活動連接
unreturnedConnectionTimeout 活動連接的時間.
jdbcurl建議不要使用autoReconnect=true。
———————————————————————-
session.close();沒有調用connection.close()嗎?
如果你的Connection來自於連接池,他只不過被歸還給池了,確實沒有物理關閉,這是正常的結果。
若調用connection.close(), 此連接對象是關閉,還是沒有關閉,只返回給了連接池 ?
那要看連接池的實現了。一般都是返回給連接池,因為新建連接的開銷太大了。
創建一個SessionFactry就對應一個Connection,面SessionFactory中的Session是共享Connection .所以關閉Session對Connection沒有影響的.
資料庫連結池不過就是一個特殊的對象池而已。 對象池的作用就是避免你直接new資源性的對象,降低開銷。把連結返回給連結池就是釋放對該對象池中該Connection對象的引用,這樣,這個對象可以給再次被別人使用。 你調用conn.close(),僅僅是釋放了引用而已,不會關閉物理的連接。
connection對像在鏈接池中複寫了close方法,所以並沒有真正意義上的關閉。明白了吧。當然不同的鏈接池有不同的實現方法,connection只是一個介面,不同的鏈接池實現類是不一樣的,只是我們感覺不到罷了。
如何用java 5分鐘實現一個最簡單的mysql代理伺服器
public class MysqlProxyServer {
private static final Logger logger = LoggerFactory.getLogger(MysqlProxyServer.class);
public static void main(String[] args) {
Vertx.vertx().deployVerticle(new MysqlProxyServerVerticle());
}
public static class MysqlProxyServerVerticle extends AbstractVerticle {
private final int port = 3306;
private final String mysqlHost = “10.10.0.6”;
@Override
public void start() throws Exception {
NetServer netServer = vertx.createNetServer();//創建代理伺服器
NetClient netClient = vertx.createNetClient();//創建連接mysql客戶端
netServer.connectHandler(socket – netClient.connect(port, mysqlHost, result – {
//響應來自客戶端的連接請求,成功之後,在建立一個與目標mysql伺服器的連接
if (result.succeeded()) {
//與目標mysql伺服器成功連接連接之後,創造一個MysqlProxyConnection對象,並執行代理方法
new MysqlProxyConnection(socket, result.result()).proxy();
} else {
logger.error(result.cause().getMessage(), result.cause());
socket.close();
}
})).listen(port, listenResult – {//代理伺服器的監聽埠
if (listenResult.succeeded()) {
//成功啟動代理伺服器
logger.info(“Mysql proxy server start up.”);
} else {
//啟動代理伺服器失敗
logger.error(“Mysql proxy exit. because: ” + listenResult.cause().getMessage(), listenResult.cause());
System.exit(1);
}
});
}
}
public static class MysqlProxyConnection {
private final NetSocket clientSocket;
private final NetSocket serverSocket;
public MysqlProxyConnection(NetSocket clientSocket, NetSocket serverSocket) {
this.clientSocket = clientSocket;
this.serverSocket = serverSocket;
}
private void proxy() {
//當代理與mysql伺服器連接關閉時,關閉client與代理的連接
serverSocket.closeHandler(v – clientSocket.close());
//反之亦然
clientSocket.closeHandler(v – serverSocket.close());
//不管那端的連接出現異常時,關閉兩端的連接
serverSocket.exceptionHandler(e – {
logger.error(e.getMessage(), e);
close();
});
clientSocket.exceptionHandler(e – {
logger.error(e.getMessage(), e);
close();
});
//當收到來自客戶端的數據包時,轉發給mysql目標伺服器
clientSocket.handler(buffer – serverSocket.write(buffer));
//當收到來自mysql目標伺服器的數據包時,轉發給客戶端
serverSocket.handler(buffer – clientSocket.write(buffer));
}
private void close() {
clientSocket.close();
serverSocket.close();
}
}
}
測試一下
try {
Class.forName(name);//指定連接類型
Connection conn = DriverManager.getConnection(url, user, password);//url為代理伺服器的地址
PreparedStatement pst = conn.prepareStatement(“select * from test;”);//準備執行語句
ResultSet resultSet = pst.executeQuery();
while (resultSet.next()) {
System.out.println(resultSet.getLong(1) + “: ” + resultSet.getString(2));
}
} catch (Exception e) {
e.printStackTrace();
}
java中怎麼連接mysql資料庫
java鏈接MySQL資料庫和鏈接其他資料庫, 基本都是一樣的套路
準備工作:
1: 資料庫驅動. 導入項目
2: 啟動MySQL服務
編碼工作:
// 1.註冊驅動
Class.forName(“com.mysql.jdbc.Driver”);
// 2.連接資料庫
Connection conn = DriverManager.getConnection(DB_URL, NAME, PSWD);
//資料庫地址,用戶名,密碼
// 3.準備執行sql語句
Statement stat = conn.createStatement();
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193894.html