MySQL+Amoeba實現數據庫主從復制和讀寫分離

MySQL讀寫分離是在主從復制的基礎上進一步通過在master上執行寫操作,在slave上執行讀操作來實現的。通過主從復制,master上的數據改動能夠同步到slave上,從而保持了數據的一致性。實現數據的讀寫分離能帶來的好處有:

  • 增加物理服務器,提升機器處理能力,也就是拿硬件換性能。

  • 主從只負責各自的讀和寫,極大程度緩解X鎖和S鎖爭用。

  • slave可以配置myIasm引擎,提升查詢性能以及節約系統開銷。

  • master直接寫是并發的,slave通過主庫發送來的binlog恢復數據是異步。

  • slave可以單獨設置一些參數來提升其讀的性能。

  • 增加冗余,提高可用性。

常見的實現數據庫讀寫分離的方案大致有兩種:應用層,代理層

在應用層也就是在代碼中進行操作,通過對數據庫操作類型的不同手動指定數據源,可以通過AOP的方式進行實現,不過對于一個已經搭建起來并正在運行的系統來說,這個方案應該比較復雜。

另外一種實現方式是通過數據庫代理層,代理對應用層呢個是透明的,所有的讀寫分離操作由代理層來完成,好處就是對于開發應用層來說是透明的,不需要管理數據源,缺點在于應用原來直接訪問數據庫現在變成了通過代理訪問數據庫,性能上肯定會有影響,不過如果代理層實現的很優秀的話這個影響應該不大。

通過代理層實現數據庫讀寫分離又有兩種方案可供選擇,其一是使用MySQL-Proxy,另一種是使用Amoeba。最開始找到的實現方案是基于MySQL-Proxy的,由于它沒有配置文件,所要完成的工作需要由Lua腳本來實現,這對于一個Lua門外漢來說壓力不小。后來找到的Amoeba實現起來很簡單,只需要簡單地配置就能實現數據庫的讀寫分離,所以這里記錄我通過使用Amoeba來實現數據庫讀寫分離的過程。

Amoeba簡介:

Amoeba(變形蟲)致力于MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專注于分布式數據庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可并發請求多臺數據庫合并結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能。

Amoeba使用:

一、準備工作

  1. amoeba使用java編寫,所以運行amoeba的運行環境要安裝好java環境,并配置好環境變量,jdk版本要在1.5以上,因為amoeba就是用jdk1.5編寫的;我的服務器java版本為1.7。
  2. amoeba是在主從同步的基礎上工作的,所以要先配置好MySQL的主從同步功能,我在另一篇日志中記錄了我實現Mysql主從同步的過程,可以參考:MySQL主從復制(Master-Slave)實踐
  3.   amoeba服務器 :虛擬機 ip:182.92.172.80 ? amoeba版本3.0.5-RC ? mysql版本5. 5.32? ?Java環境1.7.0_60 ? ?操作系統linux

    ? ? master服務器 ? ?:虛擬機 ip:182.92.172.80 ?mysql版本5. 5.32 ??操作系統centos6.5 (和amoeba在同一個服務器上,因為我只用了兩個服務器)

    ? ? slave服務器 ? ? ? :虛擬機 ip:123.57.44.85 ? mysql版本5.5.39 ? 操作系統centos6.5?

二、下載安裝amoeba

下載地址:https://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/3.x/,選擇最新版本進行下載,我下載的版本為:amoeba-mysql-3.0.5-RC-distribution.zip

安裝:把zip安裝包解壓到自己指定的服務器路徑上就可以了,我把它放在了/usr/local/amoeba/amoeba-mysql-3.0.5-RC里面,解壓后的文件結構如下圖:

?

三、配置amoeba

Amoeba基礎配置介紹:

想象Amoeba作為數據庫代理層,它一定會和很多數據庫保持通信,因此它必須知道由它代理的數據庫如何連接,比如最基礎的:主機IP、端口、Amoeba使用的用戶名和密碼等等。這些信息存儲在$AMOEBA_HOME/conf/dbServers.xml中。

Amoeba為了完成數據切分提供了完善的切分規則配置,為了了解如何分片數據、如何將數據庫返回的數據整合,它必須知道切分規則。與切分規則相關的信息存儲在$AMOEBA_HOME/conf/rule.xml中。

當我們書寫SQL來操作數據庫的時候,常常會用到很多不同的數據庫函數,比如:UNIX_TIMESTAMP()、SYSDATE()等等。這些函數如何被Amoeba解析呢?$AMOEBA_HOME/conf/functionMap.xml描述了函數名和函數處理的關系。

對$AMOEBA_HOME/conf/rule.xml進行配置時,會用到一些我們自己定義的函數,比如我們需要對用戶ID求HASH值來切分數據,這些函數在$AMOEBA_HOME/conf/ruleFunctionMap.xml中定義。

Amoeba可以制定一些可訪問以及拒絕訪問的主機IP地址,這部分配置在$AMOEBA_HOME/conf/access_list.conf中

Amoeba允許用戶配置輸出日志級別以及方式,配置方法使用log4j的文件格式,文件是$AMOEBA_HOME/conf/log4j.xml。

在開始配置amoeba配置文件之前我們需要先了解為什么要做這些配置工作。

第一,如上第一條所述,Amoeba是通過代理MySQL服務來實現數據庫的讀寫分離的,它必須要知道如何連接到需要被代理的數據庫,因此需要被代理的數據庫需要創建一個訪問用戶給amoeba,這樣amoeba才能連接到數據庫上。

第二,amobea把對客戶端也就是應用層是透明的,不管amoeba如何實現的讀寫分離,它既然把數據庫全都給代理了,那它就要為客戶端提供一個類似原來mysql那樣的連接,客戶端就把當它是mysql,它其實是一個虛擬的mysql,對外提供mysql協議,客戶端連接amoeba就象連接mysql一樣,因此amoeba要為客戶端提供一個可供連接的用戶賬號。

第三,amoeba內部是實現了多數據庫的負載均衡、讀寫分離、可切片的,所以這部分的配置是它功能上的核心配置。

下面就正式開始配置amoeba

  1. 所有數據庫創建amoeba訪問的用戶:
mysql>grant all on *.* to 'amoeba'@'182.92.172.80' identified by '123456'  #創建用戶并授權mysql>flush privileges; #刷新權限

  為了方便統一管理就把所有數據庫創建的用戶名和密碼保持一致了

  2.配置conf文件

在amoeba安裝目錄的conf文件夾下找到dbServer.xml和amoeba.xml文件,這兩個文件是需要我們配置的

我的dbServer.xml文件配置如下:

 1 <?xml version="1.0" encoding="gbk"?>
 2 
 3 <!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
 4 <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
 5 
 6         <!-- 
 7             Each dbServer needs to be configured into a Pool,
 8             If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
 9              add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
10              such as 'multiPool' dbServer   
11         -->
12         
13     <dbServer name="abstractServer" abstractive="true">
14         <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
15             <property name="connectionManager">${defaultManager}</property>
16             <property name="sendBufferSize">64</property>
17             <property name="receiveBufferSize">128</property>
18                 
19             <!-- mysql port -->
20             <!--<property name="port">3306</property>-->
21             
22             <!-- mysql schema -->
23             <property name="schema">yj_platform</property>
24             
25             <!-- mysql user -->
26             <property name="user">amoeba</property>
27             
28             <property name="password">123456</property>
29         </factoryConfig>
30 
31         <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
32             <property name="maxActive">500</property>
33             <property name="maxIdle">500</property>
34             <property name="minIdle">1</property>
35             <property name="minEvictableIdleTimeMillis">600000</property>
36             <property name="timeBetweenEvictionRunsMillis">600000</property>
37             <property name="testOnBorrow">true</property>
38             <property name="testOnReturn">true</property>
39             <property name="testWhileIdle">true</property>
40         </poolConfig>
41     </dbServer>
42 
43     <dbServer name="master"  parent="abstractServer">
44         <factoryConfig>
45             <!-- mysql ip -->
46             <property name="ipAddress">182.92.172.96</property>
47             <!-- mysql port -->
48             <property name="port">3306</property>
49         </factoryConfig>
50     </dbServer>
51     
52     <dbServer name="slave1"  parent="abstractServer">
53         <factoryConfig>
54             <!-- mysql ip -->
55             <property name="ipAddress">123.57.44.78</property>
56             <!-- mysql port -->
57             <property name="port">13306</property>
58         </factoryConfig>
59     </dbServer>
60     
61 <!--    <dbServer name="multiPool" virtual="true">
62         <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
63             #Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA
64             <property name="loadbalance">1</property>
65             
66             #Separated by commas,such as: server1,server2,server1
67             <property name="poolNames">slave1,slave2</property>
68         </poolConfig>
69     </dbServer>
70 -->        
71 </amoeba:dbServers>

?

需要我們關注的元素用標紅字體顯示出來了,在這里是指幾個dbServer元素,需要手動修改的部分用黃色背景表示出來。

第一個dbServer元素其abstractive="true"屬性表示這個一個抽象元素可以被其他dbServer元素擴展,類似于java里面的抽象類和類的繼承之間的關系。這個dbServer里面配置amoeba連接它所代理的mysql數據庫的連接信息,因為之前已經說過為了方便管理把每個數據庫為amoeba訪問創建的用戶都統一了賬號,在這里我把端口信息給注釋掉了,因為我的slave數據庫端口用的不是默認的3306,這種和ip,端口不一樣的信息就沒辦法配置在通用的抽象dbServer里面了。

第二個dbServer取名為"maser",其parent="abstractServer"表示拓展了上面的抽象dbServer,在這里設置的是amoeba連接數據庫具體的信息,因為每個數據庫的ip肯定是不同的。

同樣第三個dbServer取名為“slave”,連接信息是slave服務器。

在下面被我注釋掉的第四個dbServer其name="multiPool" virtual="true"屬性表示這是一個對多服務器池,這個配置使得amoeba可以把多個讀數據庫管理成一個讀池,把多個寫數據庫管理成寫池,在每個池中amoeba就能夠實現負載均衡。由于我的主從同步只設置了一主一從,并不涉及到多個讀數據庫組成池的情況,所以我就把這個配置注釋掉了。

接下來配置amoeba.xml文件,同樣放上我的配置文件:

 1 <?xml version="1.0" encoding="gbk"?>
 2 
 3 <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
 4 <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
 5 
 6     <proxy>
 7     
 8         <!-- service class must implements com.meidusa.amoeba.service.Service -->
 9         <service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
10             <!-- port -->
11             <property name="port">8066</property>
12             
13             <!-- bind ipAddress -->
14             
15             <!--<property name="ipAddress">127.0.0.1</property>-->
16             
17             
18             <property name="connectionFactory">
19                 <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
20                     <property name="sendBufferSize">128</property>
21                     <property name="receiveBufferSize">64</property>
22                 </bean>
23             </property>
24             
25             <property name="authenticateProvider">
26                 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
27                     
28                     <property name="user">amoeba</property>
29                     
30                     <property name="password">password</property>
31                     
32                     <property name="filter">
33                         <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
34                             <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
35                         </bean>
36                     </property>
37                 </bean>
38             </property>
39             
40         </service>
41         
42         <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">
43             
44             <!-- proxy server client process thread size -->
45             <property name="executeThreadSize">128</property>
46             
47             <!-- per connection cache prepared statement size  -->
48             <property name="statementCacheSize">500</property>
49             
50             <!-- default charset -->
51             <property name="serverCharset">utf8</property>
52             
53             <!-- query timeout( default: 60 second , TimeUnit:second) -->
54             <property name="queryTimeout">60</property>
55         </runtime>
56         
57     </proxy>
58     
59     <!-- 
60         Each ConnectionManager will start as thread
61         manager responsible for the Connection IO read , Death Detection
62     -->
63     <connectionManagerList>
64         <connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
65             <property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
66         </connectionManager>
67     </connectionManagerList>
68     
69         <!-- default using file loader -->
70     <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
71         <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
72     </dbServerLoader>
73     
74     <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
75         <property name="ruleLoader">
76             <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
77                 <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
78                 <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
79             </bean>
80         </property>
81         <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
82         <property name="LRUMapSize">1500</property>
83         <property name="defaultPool">slave1</property>
84         <property name="writePool">master</property>
85         <property name="readPool">slave1</property>
86         <property name="needParse">true</property>
87     </queryRouter>
88 </amoeba:configuration>

?

amoeba.xml文件中需要配置的地方也不多,首先要配置的是service標簽,其中需要配置的地方有三個port,user,password。這里的端口,用戶名和密碼其實就是為了虛擬出一個mysql鏈接做準備的(非真實,amoeba服務器可以不安裝真實的mysql數據庫),端口默認的事8066,可以修改但是不要跟現有的端口沖突,用戶名和密碼是客戶端連接amoeba虛擬出來的mysql連接的用戶名密碼,和之前mysql數據庫創建給amoeba的用戶賬號不同。在這里有一個注釋掉的ipAddress屬性,如果Amoeba所在的服務器在多個網絡環境內你可以定義該機器的其中一個IP來指定Amoeba所服務的網絡環境,但是如果設置為127.0.0.1將導致其他機器無法訪問Amoeba的服務。

之后配置queryRouter標簽,這是amoeba真正實現讀寫分離所產生作用的地方,之前的配置都是為了該處做準備。

該處有三個地方需要我們配置,首先是defaultPool,一些除了SELECT\UPDATE\INSERT\DELETE的語句都會在defaultPool執行。

之后是writePool,這里是配置寫庫也就是主數據庫,在這里是前面dbServer.xml中配置的master。

resdPool配置的是讀庫,我這里是slave1,如果讀庫有多個這里可以填讀池,也就是我在dbServer.xml中注釋掉的那個dbServer配置的信息。在這里就完成了讀寫分離(主寫從讀)的配置。我的配置中是把寫操作限制在了master中,把讀限制在了slave中,如果我把defaultPool改成master的話那么讀操作就會在master和slave之間做負載均衡了。

?

四、配置jvm運行參數

運行在jdk1.7環境中的amoeba要求xss參數必須大于228才能啟動JVM

所以在amoeba安裝目錄下的jvm.properties文件中進行參數設置:

 1 # app名字
 2 APP_NAME=Amoeba-MySQL
 3 
 4 # app版本號
 5 APP_VERSION=3.0.0-beta
 6 
 7 # 日志輸出路徑,log4j中可引用參數 ${project.output}
 8 
 9 APP_OUTPUT_PATH=$PROJECT_HOME/logs
10 
11 # 應用程序的PID文件存放路徑,    默認存放在: ${project.home}/${APP_NAME}.pid
12 
13 #APP_PID_PATH=/temp/logs/$APP_NAME
14 
15 
16 # 控制臺輸出到日志文件
17 
18 APP_CONSOLE_LOG=$APP_OUTPUT_PATH/console.log
19 
20 
21 # 程序相關的配置參數
22 
23 #APP_OPTIONS="-DmyParam=value1 -DmyParam2=value2"
24 
25 # 啟動參數  
26 
27 #APP_ARGS="args0 "
28 
29 
30 # JVM相關的參數,包括內存配置、垃圾回收策略
31 
32 JVM_OPTIONS="-server -Xms512m -Xmx1024m -Xss512k -XX:PermSize=16m -XX:MaxPermSize=96m"
33 
34 
35 # 應用程序忽略的信號列表,以逗號分割,程序shutdown的信號為15(可用 kill -15 pid 可讓程序文明的shutdown,請不要在這兒填15)
36 
37 IGNORE_SIGNALS=1,2

?

如上所有的配置工作就已經完成了,可以看出amoeba所需的全部配置工作還是比較少的。

啟動amoeba:

啟動腳本在amoeba安裝目錄的bin目錄下運行lancher:

root@iZ25j1wvn7pZ:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin# ./launcher
2016-12-12 21:38:05,748 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access config load completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf
2016-12-12 21:38:06,037 INFO  net.ServerableConnectionManager - Server listening on /127.0.0.1:8066.2016-12-12 22:14:44 [INFO] Project Name=Amoeba-MySQL, PID=2596 , System shutdown ....2016-12-12 22:14:48 [INFO] Project Name=Amoeba-MySQL, PID=3324 , starting...
log4j:WARN log4j config load completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/log4j.xml
2016-12-12 22:14:49,405 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access config load completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf
2016-12-12 22:14:49,664 INFO  net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.2016-12-14 15:02:14 [INFO] Project Name=Amoeba-MySQL, PID=3324 , System shutdown ....2016-12-14 15:02:20 [INFO] Project Name=Amoeba-MySQL, PID=12246 , starting...
log4j:WARN log4j config load completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/log4j.xml
2016-12-14 15:02:20,955 INFO  context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-3.0.4-BETA
log4j:WARN ip access config load completed from file:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/conf/access_list.conf
2016-12-14 15:02:21,224 INFO  net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.

?

?

運行結果如上所示表示啟動成功。

之后可以通過amoeba連接到數據庫,連接信息如下:

root@iZ25j1wvn7pZ:/usr/local/amoeba/amoeba-mysql-3.0.5-RC/bin# mysql -h182.92.172.80 -P8066 -uamoeba -ppassword
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2049945506
Server version: 5.1.45-mysql-amoeba-proxy-3.0.4-BETA (Ubuntu)Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> 

?

五、amoeba服務測試

從連接的server version 可以看出連接數據可的實例是amoeba-proxy實例不是mysql實例,這樣就表示可以通過amoeba的訪問賬戶連接amoeba服務了。之后就可以進行測試了,首先向數據庫中添加一條記錄,可以看見數據同時更新到master和slave中,主從同步功能是可以用的。之后在slave上停止slave服務,再通過amoeba寫入數據,這時amoeba重新讀出的數據就沒有新插入的數據了,因為主從同步功能已經關掉了,寫入的數據在master中,沒有同步到slave中,而amoeba讀數據是從slave中讀取的,因此沒有新加入的數據。之后打開slave的同步服務,再在amoeba中讀取就可以讀到之前添加的數據了。整體測試下來就保證了amoeba實現了讀寫分離功能。

?

參考資料:

mysql基于amoeba的讀寫分離

MySQL基于amoeba的讀寫分離及負載均衡

CentOS系統 Amoeba+MySql主從讀寫分離配置 適合新手傻

通過Amoeba對一個數據庫實例進行操作

轉載于:https://www.cnblogs.com/gl-developer/p/6178608.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270336.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從操作系統層面描述線程的五種狀態

[初始狀態] 僅是在語言層面創建 了線程對象&#xff0c; 還未與操作系統線程關聯 [可運行狀態] (就緒狀態) 指該線程已經被創建(與操作系統線程關聯)&#xff0c; 可以由CPU調度執行 [運行狀態] 指獲取了CPU時間片運行中的狀態 當CPU時間片用完&#xff0c;會從[運行狀態]轉…

html桌面圖標樣式,如何更改圖標樣式,換桌面圖標的方法

打開桌面&#xff0c;桌面上擺放了放多程序的快捷方式&#xff0c;我們每天打開電腦最先接觸的就是這些快捷方式圖標。時間長了&#xff0c;是不是感覺乏味了。可以換一換。比如&#xff0c;在我的電腦桌面上有這樣一個圖標&#xff0c;那怎樣更改桌面圖標&#xff1f;下面&…

電腦知識:筆記本電腦邊充電邊用,對電池有損害嗎?

使用筆記本的時候&#xff0c;你們有沒有這樣的習慣&#xff0c;就是插電使用&#xff0c;充滿到100%也不會拔掉充電頭。 有人說這種行為會對電腦的電池造成傷害&#xff0c;這是真的嗎&#xff1f;到底正確的使用是怎么樣的&#xff1f;今天就跟大家解答一下這個疑惑。 首先&a…

硬件知識:電源開關上的“1“和“0“分別是什么意思

幾乎所有的電器、燈具和插座上 只要帶有電源開關 必然會出現“|”和“O”兩個符號 如果只看符號判斷 “|”和“O”到底代表什么含義呢&#xff1f; 你又能分清哪個是電路聯通 哪個是電路斷開嗎&#xff1f; 很多人認為“O”是通電&#xff0c;“|”是斷電 因為英語里開是OPEN 很…

c# 正則表達式 html標簽,C#匹配HTML標簽,正則表達式誰會?

米脂JS:function StripHtml(html){var scriptregex ".]*>[sS]*?";var scripts new RegExp(scriptregex, "gim");html html.replace(scripts, " ");//Stripts the ";var styles new RegExp(styleregex , "gim");html htm…

Visual Studio 2013 添加一般應用程序(.ashx)文件到SharePoint項目

默認&#xff0c;在用vs2013開發SharePoint項目時&#xff0c;vs沒有提供一般應用程序(.ashx)的項目模板&#xff0c;本文解決此問題。 以管理員身份啟動vs2013&#xff0c;創建一個"SharePoint 2013 - 空項目",名稱我保持默認&#xff1a;SharePointProject2。 選擇…

java中線程的6種狀態

java中線程的狀態分為6種。 1. 初始(NEW)&#xff1a;新創建了一個線程對象&#xff0c;但還沒有調用start()方法。 2. 運行(RUNNABLE)&#xff1a;Java線程中將就緒&#xff08;ready&#xff09;和運行中&#xff08;running&#xff09;兩種狀態籠統的稱為“運行”。 線程對…

軟件推薦:微軟桌面助手軟件上手體驗

今天給大家分享微軟桌面助手這款軟件的使用體驗&#xff0c;感興趣的朋友可以下載體驗一下&#xff01;一、軟件介紹微軟桌面助手是微軟官方發布的一款桌面分區應用&#xff0c;其特色是支持自動移動并根據分區來整理桌面文件&#xff0c;比如在默認設置情況下&#xff0c;可以…

HTML一級菜單和二級菜單區別,JavaScript點擊一級菜單打開和關閉二級菜單

【JavaScript點擊一級菜單打開和關閉二級菜單】Document#sub_menu_1,#sub_menu_2{display: none;}ul li:hover{cursor: pointer;}一級菜單1二級餐單1二級餐單1二級餐單1二級餐單1一級菜單2二級菜單2二級菜單2二級菜單2二級菜單2一級餐單3function f(str){var sub_menu documen…

微信11個超級實用的小技巧,值得一試

目錄 1.1 微信收藏當備忘錄用 1.2 保存長圖 1.3 分類存放微信文件 2.1 快速備注好友姓名 2.2 取消單條朋友圈的消息提醒 2.3 查看群聊中錯過的紅包 3.1 去除紅點 4.1 換行 4.2 批量保存視頻 4.3 清除微信緩存 微信對于現在的朋友們來說&#xff0c;可以說是日常使用頻率最高的軟…

html獲取qq頭像代碼,jQuery在線獲取QQ名稱和頭像

正文昨天群里有人問到dux主題的評論處輸入QQ號直接獲取名稱和頭像是怎么實現的&#xff0c;我看了一下dux主題&#xff0c;發現并沒有集成這個功能&#xff0c;倒是emlog的dux主題內置了這個功能&#xff0c;本來想移植過來wordpress的&#xff0c;但是發現emlog和wp的評論模塊…

網絡知識:詳解各種路由器組網方法

很多朋友可能會問到&#xff0c;關不同網段的兩個電腦如何實現互相訪問&#xff1f;這個問題通常在企業辦公中會遇到&#xff0c;我們經常會遇到企業隨著員工或部門的增多&#xff0c;增加了一個路由器&#xff0c;分了兩個網段&#xff0c;A子網和B子網處于不同網段&#xff0…

多線程之競態條件

言&#xff1a;要想理解多線程之間的競爭&#xff0c;第一個問題就是你需要知道什么是競態條件&#xff1f; 競態條件是指同一個程序多線程訪問同一個資源&#xff0c;如果對資源的訪問順序敏感&#xff0c;就稱存在競態條件&#xff0c;代碼區成為臨界區。最常見的競態條件為…

html怎么做模糊條紋,如何使用純CSS實現彩虹條紋文字的效果

源代碼下載https://github.com/comehope/front-end-daily-challenges代碼解讀定義dom&#xff0c;容器中包含文本&#xff0c;并且包含4個用于特效&#xff0c;的data-text屬性值為與文本相同&#xff1a;web居中顯示&#xff1a;html,body{height:100%;display:flex;align-ite…

硬件知識:液晶拼接屏安裝技巧及專業知識

目錄 1、安裝地面的選擇 2、布線的注意事項 3、環境光線要求 4、框架要求 5、通風要求 6、液晶拼接技術專業知識 1、液晶拼接屏與其它電腦顯示器的對比優勢 2、液晶拼接屏超窄邊框設計 3、液晶拼接屏高解像度支援點對點顯示 4、液晶拼接屏采用高質量電子元器件&#xff08;IC、…

2016年終總結

再有半個月&#xff0c;就徹底的與2016告別了&#xff0c;在這里&#xff0c;也湊個熱鬧&#xff0c;寫個總結吧。 這一年&#xff0c;是我從事這個前端行業的第三個年頭&#xff0c;也是我真正的開始了解這個行業&#xff0c;而真正的為之努力與奮斗的一年。 從14年初懵懵懂懂…

ios 標簽 html,ios 顯示HTML標簽文本

第一種:- (void)viewDidLoad{[super viewDidLoad];NSString *strHTML "你好這是一個例子&#xff0c;請顯示外加一個tableaaaabbbbcccc";UIWebView *webView [[UIWebView alloc] initWithFrame:self.view.frame];[self.view addSubview:webView];[webView loadHTML…

?軟件推薦:17 款必備Chrome瀏覽器插件,值得一試

美化 Just Black 午夜黑官方主題 Dark Reader 暗黑主題 為什么你們就是不能加個空格呢&#xff1f; 標簽管理 Momentum 【新標簽頁】 Tab Manager Plus 【標簽管理器】 OneTab 【標簽頁整理】 生產效率 Octotree 【GitHub 樹形菜單】 劃詞翻譯 JSON Formatter 【JSON 格…