1. java什麼是讀寫分離

原話叫,讀寫分離主從同步java 讀寫分離可以用兩條線程做到,一條線程讀,一條線程寫,應該有個同步容器扮演存儲倉庫的角色,比如說 就是集合經過改造的,線程還得上鎖,大概就是這么個情況,點贊我謝謝

2. postgresql已經配置好主從,java中怎麼進行讀寫分離

新建一個java項目,項目的目錄結構如下所示,其中ReadRunnable.java是讀文件的線程內類,WriteRunnable.java是寫文件的線程類,Test.java是代容表讀寫文件的實現類及main方法入口類

ReadRunnable.java的代碼實現

WriteRunnable.java的代碼實現

Test.java的代碼實現

3. java如何分開設置snmp讀寫團體字

你所說的團體名,就是那個community string了。預設是public,但一般為了安全起見,設備管理者都會改成自己的,相當於密碼,你不可能看到。
如果你有配置許可權,你可以看到路由器配置里有一句:
snmp-server community somestring
其中那個somestring就是你那snmp密碼。

4. 基於Java的應用MySQL讀寫分離用什麼工具或類庫來實現

如果有用spring的話 試試繼承AbstractRoutingDataSource。 具體可以上網查查。
我們項目在用,還不錯吧。

5. Struts+hibernate怎麼配置讀寫分離

Java代碼
importjava.lang.reflect.Method;
importorg.springframework.aop.AfterReturningAdvice;
importorg.springframework.aop.MethodBeforeAdvice;
importorg.springframework.aop.ThrowsAdvice;

importcom.company.datasource.DataSourceSwitcher;

,AfterReturningAdvice,ThrowsAdvice{
//service方法執行之前被調用
publicvoidbefore(Methodmethod,Object[]args,Objecttarget)throwsThrowable{
System.out.println("切入點:"+target.getClass().getName()+"類中"+method.getName()+"方法");
if(method.getName().startsWith("add")
||.getName().startsWith("create")
||method.getName().startsWith("save")
||method.getName().startsWith("edit")
||method.getName().startsWith("update")
||method.getName().startsWith("delete")
||method.getName().startsWith("remove")){
System.out.println("切換到:master");
DataSourceSwitcher.setMaster();
}
else{
System.out.println("切換到:slave");
DataSourceSwitcher.setSlave();
}
}

//service方法執行完之後被調用
publicvoidafterReturning(Objectarg0,Methodmethod,Object[]args,Objecttarget)throwsThrowable{
}

//拋出Exception之後被調用
publicvoidafterThrowing(Methodmethod,Object[]args,Objecttarget,Exceptionex)throwsThrowable{
DataSourceSwitcher.setSlave();
System.out.println("出現異常,切換到:slave");
}

}

6. 如何在應用層通過spring特性解決資料庫讀寫分離

兩種方案

方案1:當只有讀操作的時候,直接操作讀庫(從庫);
當在寫事務(即寫主庫)中讀時,也是讀主庫(即參與到主庫操作),這樣的優勢是可以防止寫完後可能讀不到剛才寫的數據;

此方案其實是使用事務傳播行為為:SUPPORTS解決的。

方案2:當只有讀操作的時候,直接操作讀庫(從庫);
當在寫事務(即寫主庫)中讀時,強制走從庫,即先暫停寫事務,開啟讀(讀從庫),然後恢復寫事務。
此方案其實是使用事務傳播行為為:NOT_SUPPORTS解決的。

核心組件
cn.javass.common.datasource.ReadWriteDataSource:讀寫分離的動態數據源,類似於AbstractRoutingDataSource,具體參考javadoc;
cn.javass.common.datasource.ReadWriteDataSourceDecision:讀寫庫選擇的決策者,具體參考javadoc;
cn.javass.common.datasource.ReadWriteDataSourceProcessor:此類實現了兩個職責(為了減少類的數量將兩個功能合並到一起了):讀/寫動態資料庫選擇處理器、通過AOP切面實現讀/寫選擇,具體參考javadoc。

具體配置
1、數據源配置
1.1、寫庫配置
Java代碼
<bean id="writeDataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="alias" value="writeDataSource"/>
<property name="driver" value="${write.connection.driver_class}" />
<property name="driverUrl" value="${write.connection.url}" />
<property name="user" value="${write.connection.username}" />
<property name="password" value="${write.connection.password}" />
<property name="maximumConnectionCount" value="${write.proxool.maximum.connection.count}"/>
<property name="minimumConnectionCount" value="${write.proxool.minimum.connection.count}" />
<property name="statistics" value="${write.proxool.statistics}" />
<property name="simultaneousBuildThrottle" value="${write.proxool.simultaneous.build.throttle}"/>
</bean>

1.2、讀庫配置
Java代碼
<bean id="readDataSource1" class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="alias" value="readDataSource"/>
<property name="driver" value="${read.connection.driver_class}" />
<property name="driverUrl" value="${read.connection.url}" />
<property name="user" value="${read.connection.username}" />
<property name="password" value="${read.connection.password}" />
<property name="maximumConnectionCount" value="${read.proxool.maximum.connection.count}"/>
<property name="minimumConnectionCount" value="${read.proxool.minimum.connection.count}" />
<property name="statistics" value="${read.proxool.statistics}" />
<property name="simultaneousBuildThrottle" value="${read.proxool.simultaneous.build.throttle}"/>
</bean>
1.3、讀寫動態庫配置
通過writeDataSource指定寫庫,通過readDataSourceMap指定從庫列表,從庫列表默認通過順序輪詢來使用讀庫,具體參考javadoc;
Java代碼
<bean id="readWriteDataSource" class="cn.javass.common.datasource.ReadWriteDataSource">
<property name="writeDataSource" ref="writeDataSource"/>
<property name="readDataSourceMap">
<map>
<entry key="readDataSource1" value-ref="readDataSource1"/>
<entry key="readDataSource2" value-ref="readDataSource1"/>
<entry key="readDataSource3" value-ref="readDataSource1"/>
<entry key="readDataSource4" value-ref="readDataSource1"/>
</map>
</property>
</bean>

2、XML事務屬性配置
所以讀方法必須是read-only(必須,以此來判斷是否是讀方法)。
Java代碼
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="merge*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />

<tx:method name="put*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="use*" read-only="true"/>
<tx:method name="get*" read-only="true" />
<tx:method name="count*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="list*" read-only="true" />

<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

3、事務管理器
事務管理器管理的是readWriteDataSource
Java代碼
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="readWriteDataSource"/>
</bean>

4、讀/寫動態資料庫選擇處理器
根據之前的txAdvice配置的事務屬性決定是讀/寫,具體參考javadoc;
forceChoiceReadWhenWrite:用於確定在如果目前是寫(即開啟了事務),下一步如果是讀,是直接參與到寫庫進行讀,還是強制從讀庫讀,具體參考javadoc;
Java代碼
<bean id="" class="cn.javass.common.datasource.ReadWriteDataSourceProcessor">
<property name="forceChoiceReadWhenWrite" value="false"/>
</bean>

5、事務切面和讀/寫庫選擇切面
Java代碼
<aop:config expose-proxy="true">
<!-- 只對業務邏輯層實施事務 -->
<aop:pointcut id="txPointcut" expression="execution(* cn.javass..service..*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>

<!-- 通過AOP切面實現讀/寫庫選擇 -->
<aop:aspect order="-2147483648" ref="">
<aop:around pointcut-ref="txPointcut" method="determineReadOrWriteDB"/>
</aop:aspect>
</aop:config>
1、事務切面一般橫切業務邏輯層;
2、此處我們使用的通過AOP切面實現讀/寫庫選擇功能,order=Integer.MIN_VALUE(即最高的優先順序),從而保證在操作事務之前已經決定了使用讀/寫庫。

6、測試用例
只要配置好事務屬性(通過read-only=true指定讀方法)即可,其他選擇讀/寫庫的操作都交給完成。

可以參考附件的:
cn.javass.readwrite.
cn.javass.readwrite.

可以下載附件的代碼進行測試,具體選擇主/從可以參考日誌輸出。

7. java怎麼實現讀寫分離 數據一致性

讀寫分離一般用在資料庫和緩存的架構設計方面。讀庫只負責返回查詢結果,寫庫只負責更新和增加,然後兩個庫實時同步。一般系統的讀壓力比寫壓力大的多,這樣可以設計多個讀庫分擔查詢的壓力。

8. 基於Java的應用MySQL讀寫分離用什麼工具或類庫來實現

對於數據層的讀寫分離應該是從資料庫這快來做,後端只是調用不同的實例而已,讀寫分離就是做一個主服務之外,有幾台只能做讀操作的從服務,然後業務層在只需要讀操作時去連接只讀伺服器就好了吧

9. java readwritelock讀寫分離嗎

讀寫鎖 ReadWriteLock讀寫鎖維護了一對相關的鎖,一個用於只讀操作,一個用於寫入操作。只要沒有,讀取鎖可以由多個reader線程同時保持。寫入鎖是獨占的。
互斥鎖一次只允許一個線程訪問共享數據,哪怕進行的是只讀操作;讀寫鎖允許對共享數據進行更高級別的並發訪問:對於寫操作,一次只有一個線程(write線程)可以修改共享數據,對於讀操作,允許任意數量的線程同時進行讀取。
與互斥鎖相比,使用讀寫鎖能否提升性能則取決於讀寫操作期間讀取數據相對於修改數據的頻率,以及數據的爭用——即在同一時間試圖對該數據執行讀取或寫入操作的線程數。
讀寫鎖適用於讀多寫少的情況。
可重入讀寫鎖 ReentrantReadWriteLock
屬性ReentrantReadWriteLock 也是基於 AbstractQueuedSynchronizer 實現的,它具有下面這些屬性(來自Java doc文檔):

* 獲取順序:此類不會將讀取者優先或寫入者優先強加給鎖訪問的排序。

* 非公平模式(默認):連續競爭的非公平鎖可能無限期地推遲一個或多個reader或writer線程,但吞吐量通常要高於公平鎖。
* 公平模式:線程利用一個近似到達順序的策略來爭奪進入。當釋放當前保持的鎖時,可以為等待時間最長的單個writer線程分配寫入鎖,如果有一組等待時間大於所有正在等待的writer線程的reader,將為該組分配讀者鎖。
* 試圖獲得公平寫入鎖的非重入的線程將會阻塞,除非讀取鎖和寫入鎖都自由(這意味著沒有等待線程)。

* 重入:此鎖允許reader和writer按照 ReentrantLock 的樣式重新獲取讀取鎖或寫入鎖。在寫入線程保持的所有寫入鎖都已經釋放後,才允許重入reader使用讀取鎖。
writer可以獲取讀取鎖,但reader不能獲取寫入鎖。
* 鎖降級:重入還允許從寫入鎖降級為讀取鎖,實現方式是:先獲取寫入鎖,然後獲取讀取鎖,最後釋放寫入鎖。但是,從讀取鎖升級到寫入鎖是不可能的。
* 鎖獲取的中斷:讀取鎖和寫入鎖都支持鎖獲取期間的中斷。
* Condition 支持:寫入鎖提供了一個 Condition 實現,對於寫入鎖來說,該實現的行為與 ReentrantLock.newCondition() 提供的Condition 實現對 ReentrantLock 所做的行為相同。當然,此 Condition 只能用於寫入鎖。
讀取鎖不支持 Condition,readLock().newCondition() 會拋出 UnsupportedOperationException。
* 監測:此類支持一些確定是讀取鎖還是寫入鎖的方法。這些方法設計用於監視系統狀態,而不是同步控制。

實現AQS 回顧在之前的文章已經提到,AQS以單個 int 類型的原子變數來表示其狀態,定義了4個抽象方法( tryAcquire(int)、tryRelease(int)、tryAcquireShared(int)、tryReleaseShared(int),前兩個方法用於獨占/排他模式,後兩個用於共享模式 )留給子類實現,用於自定義同步器的行為以實現特定的功能。
對於 ReentrantLock,它是可重入的獨占鎖,內部的 Sync 類實現了 tryAcquire(int)、tryRelease(int) 方法,並用狀態的值來表示重入次數,加鎖或重入鎖時狀態加 1,釋放鎖時狀態減 1,狀態值等於 0 表示鎖空閑。
對於 CountDownLatch,它是一個關卡,在條件滿足前阻塞所有等待線程,條件滿足後允許所有線程通過。內部類 Sync 把狀態初始化為大於 0 的某個值,當狀態大於 0 時所有wait線程阻塞,每調用一次 countDown 方法就把狀態值減 1,減為 0 時允許所有線程通過。利用了AQS的共享模式。
現在,要用AQS來實現 ReentrantReadWriteLock。
一點思考問題
* AQS只有一個狀態,那麼如何表示 多個讀鎖 與 單個寫鎖 呢?
* ReentrantLock 里,狀態值表示重入計數,現在如何在AQS里表示每個讀鎖、寫鎖的重入次數呢?
* 如何實現讀鎖、寫鎖的公平性呢?

一點提示
* 一個狀態是沒法既表示讀鎖,又表示寫鎖的,不夠用啊,那就辦成兩份用了,客家話說一個飯粒咬成兩半吃,狀態的高位部分表示讀鎖,低位表示寫鎖,由於寫鎖只有一個,所以寫鎖的重入計數也解決了,這也會導致寫鎖可重入的次數減小。
* 由於讀鎖可以同時有多個,肯定不能再用辦成兩份用的方法來處理了,但我們有 ThreadLocal,可以把線程重入讀鎖的次數作為值存在 ThreadLocal 里。
* 對於公平性的實現,可以通過AQS的等待隊列和它的抽象方法來控制,在狀態值的另一半里存儲當前持有讀鎖的線程數。如果讀線程申請讀鎖,當前寫鎖重入次數不為 0 時,則等待,否則可以馬上分配;如果是寫線程申請寫鎖,當前狀態為 0 則可以馬上分配,否則等待。

10. JAVA WEB工程應該怎樣連接,MYSQL讀寫分離資料庫伺服器

既然那麼多MYSQL 伺服器,就使用集群唄。。。。。。如果那樣分離,同步是大問題。