<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    相對Hibernate和Apache OJB 等“一站式”ORM解決方案而言,ibatis 是一種“半

    自動化”的ORM實現(xiàn)。

    以前ORM的框架(hibernate,ojb)的局限:

    1. 系統(tǒng)的部分或全部數(shù)據(jù)來自現(xiàn)有數(shù)據(jù)庫,處于安全考慮,只對開發(fā)團隊提供幾條Select SQL(或存儲過程)以獲取所需數(shù)據(jù),具體的表結(jié)構不予公開。

    2. 開發(fā)規(guī)范中要求,所有牽涉到業(yè)務邏輯部分的數(shù)據(jù)庫操作,必須在數(shù)據(jù)庫層由存儲過程實現(xiàn)(就筆者工作所面向的金融行業(yè)而言,工商銀行、中國銀行、交通銀行,都在開發(fā)規(guī)范中嚴格指定)

    3. 系統(tǒng)數(shù)據(jù)處理量巨大,性能要求極為苛刻,這往往意味著我們必須通過經(jīng)過高度優(yōu)化的SQL語句(或存儲過程)才能達到系統(tǒng)性能設計指標。

    ibatis 的著力點:

    在于POJO 與SQL之間的映射關系。也就是說,ibatis

    并不會為程序員在運行期自動生成SQL 執(zhí)行。具體的SQL 需要程序員編寫,然后通過映射配置文件,將SQL所需的參數(shù),以及返回的結(jié)果字段映射到指定POJO。

    Ibatis與Hibernate的區(qū)別:

    Hibernate提供了全面的數(shù)據(jù)庫封裝機制的“全自動化”ORM 實現(xiàn)而言,“全自動”ORM 實現(xiàn)了POJO 和數(shù)據(jù)庫表之間的映射,以及SQL 的自動生成和執(zhí)行,而ibatis 的著力點,則在于POJO 與SQL之間的映射關系。也就是說,ibatis并不會為程序員在運行期自動生成SQL 執(zhí)行。具體的SQL 需要程序員編寫,然后通過映射配置文件,將SQL所需的參數(shù),以及返回的結(jié)果字段映射到指定POJO。

    ibatis配置文件:

    <?xml version="1.0" encoding="UTF-8" ?>

    <!DOCTYPE sqlMapConfig

    PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"

    "

    <sqlMapConfig>

    <settings ⑴

    cacheModelsEnabled="true"

    enhancementEnabled="true"

    lazyLoadingEnabled="true"

    errorTracingEnabled="true"

    maxRequests="32"

    maxSessions="10"

    maxTransactions="5"

    useStatementNamespaces="false"

    />

    <transactionManager type="JDBC"> ⑵

    <dataSource type="SIMPLE"> ⑶

    <property name="JDBC.Driver"

    value="com.p6spy.engine.spy.P6SpyDriver"/>

    <property name="JDBC.ConnectionURL"

    value="jdbc:mysql://localhost/sample"/>

    <property name="JDBC.Username" value="user"/>

    <property name="JDBC.Password" value="mypass"/>

    <property name="Pool.MaximumActiveConnections"

    value="10"/>

    <property name="Pool.MaximumIdleConnections" value="5"/>

    <property name="Pool.MaximumCheckoutTime"

    value="120000"/>

    <property name="Pool.TimeToWait" value="500"/>

    <property name="Pool.PingQuery" value="select 1 from

    ACCOUNT"/>

    <property name="Pool.PingEnabled" value="false"/>

    <property name="Pool.PingConnectionsOlderThan"

    value="1"/>

    <property name="Pool.PingConnectionsNotUsedFor"

    value="1"/>

    </dataSource>

    </transactionManager>

    <sqlMap resource="com/ibatis/sample/User.xml"/> ⑷

    <sqlMap resource="com/ibatis/sample/Address.xml"/>

    </sqlMapConfig>

    ⑴Settings 節(jié)點 參數(shù)

    描述

    cacheModelsEnabled

    是否啟用SqlMapClient上的緩存機制。建議設為"true"

    enhancementEnabled

    是否針對POJO啟用字節(jié)碼增強機制以提升getter/setter的調(diào)用效能,避免使用JavaReflect所帶來的性能開銷。同時,這也為Lazy Loading帶來了極大的性能提升。建議設為"true"

    errorTracingEnabled

    是否啟用錯誤日志,在開發(fā)期間建議設為"true"以方便調(diào)試

    lazyLoadingEnabled

    是否啟用延遲加載機制,建議設為"true"

    maxRequests

    最大并發(fā)請求數(shù)(Statement并發(fā)數(shù))

    maxTransactions

    最大并發(fā)事務數(shù)

    maxSessions

    最大Session 數(shù)。即當前最大允許的并發(fā)SqlMapClient數(shù)。maxSessions設定必須介于maxTransactions和maxRequests之間,即 maxTransactions<maxSessions=<maxRequests

    useStatementNamespaces

    是否使用Statement命名空間。這里的命名空間指的是映射文件中,sqlMap節(jié)點的namespace屬性,如在上例中針對t_user

    表的映射文件sqlMap節(jié)點:

    <sqlMap namespace="User">

    這里,指定了此sqlMap節(jié)點下定義的操作均從屬于"User"命名空間。

    在useStatementNamespaces="true"的情況下,Statement調(diào)用需追加命名空間,如:sqlMap.update("User.updateUser",user);否則直接通過Statement名稱調(diào)用即可,如:sqlMap.update("updateUser",user);

    但請注意此時需要保證所有映射文件中,Statement定義無重名。

    ⑵ transactionManager節(jié)點

    transactionManager 節(jié)點定義了ibatis 的事務管理器,目前提供了以下幾種選擇:

    Ø JDBC

    通過傳統(tǒng)JDBC Connection.commit/rollback實現(xiàn)事務支持。

    Ø JTA

    使用容器提供的JTA服務實現(xiàn)全局事務管理。

    Ø EXTERNAL

    外部事務管理,如在EJB中使用ibatis,通過EJB的部署配置即可實現(xiàn)自動的事務管理機制。此時ibatis 將把所有事務委托給外部容器進行管理。此外,通過Spring 等輕量級容器實現(xiàn)事務的配置化管理也是一個不錯的選擇。關于結(jié)合容器實現(xiàn)事務管理,參見“高級特性”中的描述。

    ⑶ dataSource節(jié)點

    dataSource從屬于transactionManager節(jié)點,用于設定ibatis運行期使用的DataSource屬性。

    type屬性: dataSource節(jié)點的type屬性指定了dataSource的實現(xiàn)類型。可選項目:

    Ø SIMPLE:

    SIMPLE是ibatis內(nèi)置的dataSource實現(xiàn),其中實現(xiàn)了一個簡單的數(shù)據(jù)庫連接池機制,對應ibatis 實現(xiàn)類為com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。

    Ø DBCP:

    基于Apache DBCP 連接池組件實現(xiàn)的DataSource 封裝,當無容器提供DataSource 服務時,建議使用該選項,對應ibatis 實現(xiàn)類為com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。

    Ø JNDI:

    使用J2EE 容器提供的DataSource 實現(xiàn),DataSource 將通過指定的JNDI Name 從容器中獲取。對應ibatis 實現(xiàn)類為com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。

    dataSource的子節(jié)點說明(SIMPLE&DBCP):

    參數(shù)

    描述

    JDBC.Driver

    JDBC 驅(qū)動。如:com.microsoft.jdbc.sqlserver.SQLServerDriver

    JDBC.ConnectionURL

    數(shù)據(jù)庫URL。如:

    jdbc:microsoft:sqlserver://localhost:1433;databaseName=ibatis如果用的是SQLServer JDBC Driver,需要在url后追加SelectMethod=Cursor以獲得JDBC事務的多Statement支持。

    JDBC.Username

    數(shù)據(jù)庫用戶名

    JDBC.Password

    數(shù)據(jù)庫用戶密碼

    Pool.MaximumActiveConn

    ections

    數(shù)據(jù)庫連接池可維持的最大容量。

    Pool.MaximumIdleConnec

    tions

    數(shù)據(jù)庫連接池中允許的掛起(idle)連接數(shù)。

    以上子節(jié)點適用于SIMPLE 和DBCP 模式,分別針對SIMPLE 和DBCP 模式的DataSource私有配置節(jié)點如下:

    SIMPLE:

    Pool.MaximumCheckoutTime

    數(shù)據(jù)庫聯(lián)接池中,連接被某個任務所允許占用的最大時間,如果超過這個時間限定,連接將被強制收回。(毫秒)

    Pool.TimeToWait

    當線程試圖從連接池中獲取連接時,連接池中無可用連接可供使用,此時線程將進入等待狀態(tài),直到池中出現(xiàn)空閑連接。此參數(shù)設定了線程所允許等待的最長時間。(毫秒)

    Pool.PingQuery

    數(shù)據(jù)庫連接狀態(tài)檢測語句。某些數(shù)據(jù)庫在連接在某段時間持續(xù)處于空閑狀態(tài)時會將其斷開。而連接池管理器將通過此語句檢測池中連接是否可用。檢測語句應該是一個最簡化的無邏輯SQL。如“select 1 from t_user”,如果執(zhí)行此語句成功,連接池管理器將認為此連接處于可用狀態(tài)

    Pool.PingEnabled

    是否允許檢測連接狀態(tài)。

    Pool.PingConnectionsOlderThan

    對持續(xù)連接時間超過設定值(毫秒)的連接進行檢測。

    Pool.PingConnectionsNotUsedFor

    對空閑超過設定值(毫秒)的連接進行檢測。

    DBCP:

    Pool.MaximumWait

    當線程試圖從連接池中獲取連接時,連接池中無可用連接可供使用,此時線程將進入等待狀態(tài),直到池中出現(xiàn)空閑連接。此參數(shù)設定了線程所允許等待的最長時間。(毫秒)

    Pool.ValidationQuery

    數(shù)據(jù)庫連接狀態(tài)檢測語句。某些數(shù)據(jù)庫在連接在某段時間持續(xù)處于空閑狀態(tài)時會將其斷開。而連接池管理器將通過此語句檢測池中連接是否可用。檢測語句應該是一個最簡化的無邏輯SQL。如“select 1 from t_user”,如果執(zhí)行此語句

    成功,連接池管理器將認為此連接處于可用狀態(tài)。

    Pool.LogAbandoned

    當數(shù)據(jù)庫連接被廢棄時,是否打印日志。

    Pool.RemoveAbandonedTimeout

    數(shù)據(jù)庫連接被廢棄的最大超時時間

    Pool.RemoveAbandoned

    當連接空閑時間超過RemoveAbandonedTimeout時,是否將其廢棄。

    JNDI:

    由于大部分配置是在應用服務器中進行,因此ibatis中的配置相對簡單,下面是分別使用JDBC和JTA事務管理的JDNI配置:

    使用JDBC事務管理的JNDI DataSource配置

    <transactionManager type="JDBC" >

    <dataSource type="JNDI">

    <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>

    </dataSource>

    </transactionManager>

    <transactionManager type="JTA" >

    <property name="UserTransaction" value="java:/ctx/con/UserTransaction"/>

    <dataSource type="JNDI">

    <property name="DataSource" value="java:comp/env/jdbc/myDataSource"/>

    </dataSource>

    </transactionManager>

    ⑷ sqlMap節(jié)點

    sqlMap 節(jié)點指定了映射文件的位置,配置中可出現(xiàn)多個sqlMap 節(jié)點,以指定項目內(nèi)所包含的所有映射文件。

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"

    "

    <sqlMap namespace="映射文件名稱:User">

    <typeAlias alias="user" type="com.ibatis.sample.User"/> 給對應的類取別名

    <cacheModel id="userCache" type="LRU">

    <flushInterval hours="24"/> 設定緩存有效期

    <flushOnExecute statement=" updateUser"/>

    指定執(zhí)行特定Statement時,將緩存清空。如updateUser操作將更新數(shù)據(jù)庫中的用戶信息,這將導致緩存中的數(shù)據(jù)對象與數(shù)據(jù)庫中的實際數(shù)據(jù)發(fā)生偏差,因此必須將緩存清空以避免臟數(shù)據(jù)的出現(xiàn)。

    <property name="size" value="1000" /> CacheModel中最大容納的數(shù)據(jù)對象數(shù)量

    </cacheModel>

    申明了一個名為"userCache"的cacheModel,之后可以在Statement申明中對其進行引用:例如:

    <select id="getUser" parameterClass="java.lang.String" resultClass="user"

    cacheModel="userCache">

    <select id="" parameterClass="java.lang.String" resultClass="user">

    <![CDATA[    可以避免SQL 中與XML 規(guī)范相沖突的字符對XML映射文件的合法性造成影響。

    SQL語句

    ]]>

    </select>

    < update id=" " parameterClass="java.lang.String" >

    <![CDATA[

    SQL語句

    ]]>

    </ update >

    < insert id=" " parameterClass="java.lang.String" >

    <![CDATA[

    SQL語句

    ]]>

    </ insert >

    < delete id="" parameterClass="java.lang.String" >

    <![CDATA[

    SQL語句

    ]]>

    </ delete >

    </sqlMap>

    需要一個JAVABEAN:有getter和setter方法

    如何讀取配置文件:

           public class SQLMapper {

           public static SqlMapClient sqlMapper;

           static{

                  String resource = "org/lzp/xml/SqlMapConfig.xml";指明了配置文件的相對路徑

                  try {

                         Reader reader = Resources.getResourceAsReader(resource);

               //ibatis2.0

               /* XmlSqlMapClientBuilder xmlBuilder =

    new XmlSqlMapClientBuilder();

    sqlMapper = xmlBuilder.buildSqlMap(reader);

    */

    //ibatis1.0

                         sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);

                  } catch (Exception e) {

                         e.printStackTrace();

                  }

           }

    }

    SqlMapClient是ibatis運作的核心,所有操作均通過SqlMapClient實例完成。例如:

    sqlMapper.insert("名稱", 參數(shù));

    sqlMapper提供了眾多數(shù)據(jù)操作方法,下面是一些常用方法的示例,具體說明文檔請參見ibatis java doc,或者ibatis官方開發(fā)手冊。

    Statement配置:

    Statement配置包含了數(shù)個與SQL Statement相關的節(jié)點,分別為:

    u statement: 最為通用,它可以替代其余的所有節(jié)點。

    u insert

    u delete

    u update

    u select

    u procedure

    參數(shù)描述:可以是類、基本數(shù)據(jù)類型和MAP進行傳值

    參數(shù)

    描述

    parameterClass

    參數(shù)類。指定了參數(shù)的完整類名(包括包路徑)。

    可通過別名避免每次重復書寫冗長的類名。

    resultClass

    結(jié)果類。指定結(jié)果類型的完整類名(包括包路徑)

    可通過別名避免每次重復書寫冗長的類名。

    parameterMap

    參數(shù)映射,需結(jié)合parameterMap節(jié)點對映射關系加以定義。對于存儲過程之外的statement而言,建議使用parameterClass作為參數(shù)配置方式,一方面避免了參數(shù)映射配置工作,另一方面其性能表現(xiàn)也更加出色。

    resultMap

    結(jié)果映射,需結(jié)合resultMap節(jié)點對映射關系加以定義。

    cacheModel

    statement對應的Cache模塊。

    動態(tài)映射:

    <select id="getUsers" parameterClass="user" resultClass="user">

    Select id,name,sex from t_user

    <dynamic prepend="WHERE">

    <isNotEmpty prepend="AND" property="name">

    (name like #name#)

    </isNotEmpty>

    <isNotEmpty prepend="AND" property="address">

    (address like #address#)

    </isNotEmpty>

    </dynamic>

    </select>

    Ø 一元判定: 是針對屬性值本身的判定,如屬性是否為NULL,是否為空值等。

    一元判定節(jié)點有:

    節(jié)點名

    描述

    <isPropertyAvailable>

    參數(shù)類中是否提供了此屬性

    <isNotPropertyAvailable>

    與<isPropertyAvailable>相反

    <isNull>

    屬性值是否為NULL

    <isNotNull>

    與<isNull>相反

    <isEmpty>

    如果屬性為Collection或者String,其size是否<1,

    如果非以上兩種類型,則通過

    String.valueOf(屬性值)

    獲得其String類型的值后,判斷其size是否<1

    <isNotEmpty>

    與<isEmpty>相反。

    Ø 二元判定

    二元判定有兩個判定參數(shù),一是屬性名,而是判定值,如

    <isGreaterThan prepend="AND" property="age" compareValue="18">

    (age=#age#)

    </isGreaterThan>

    其中,property="age"指定了屬性名”age”,compareValue=”18”指明了判定值為”18”。上面判定節(jié)點isGreaterThan 對應的語義是:如果age 屬性大于

    18(compareValue),則在SQL中加入(age=#age#)條件。

    二元判定節(jié)點有:

    節(jié)點名

    屬性值與compareValues的關系

    <isEqual>

    相等。

    <isNotEqual>

    不等。

    <isGreaterThan>

    大于

    <isGreaterEqual>

    大于等于

    <isLessThan>

    小于

    <isLessEqual>

    小于等于

    posted @ 2008-08-29 12:07 小馬歌 閱讀(1689) | 評論 (0)編輯 收藏
     
    好用的東東

    /Files/xiaomage234/uu.rar
    posted @ 2008-08-25 17:33 小馬歌 閱讀(191) | 評論 (0)編輯 收藏
     
    因為第一次登錄并保存密碼之后,會緩存到本地,所以要刪除這么一個緩存文件。
    地址是: %APPDATA%\Subversion\auth\svn.simple
    posted @ 2008-08-21 10:25 小馬歌 閱讀(1023) | 評論 (1)編輯 收藏
     
    今天準備安裝一個Bugzilla為工作提供方便。
    準備:下載Mysql,Bugzilla,Apache

    安裝:
    1、Mysql安裝
      我是到Mysql官方網(wǎng)站下載For Suse的rpm包(下載了所有的rpm包,本來只安裝了server包,不過最后因為缺包而中斷安裝)。
      安裝所有的Mysql包:
      #rpm -ivh Mysql-*

      最后就是對數(shù)據(jù)庫進行設置:
      #mysql
        mysql>create database bugs;
        mysql>GRANT SELECT, INSERT,UPDATE, DELETE, INDEX, ALTER,CREATE,LOCK TABLES,CREATE TEMPORARY TABLES, DROP, REFERENCES ON bugs.* TO bugs@localhost IDENTIFIED BY 'bugs';
        mysql>FLUSH PRIVILEGES;
        mysql>quit

      這樣就建了一個bugs表;一個用戶名為bugs,密碼的Mysql用戶。

    2、安裝Apache
      到Apache官方網(wǎng)站下載源代碼。
      #./configure
      #make
      #make install

    安裝完畢。
    啟動Apache
      #./apachectl start
    不過這里是用root來啟動的,如果切換到其它用戶啟動就會拋出錯誤,說沒有權限,在網(wǎng)上找了些資料,但最終也未能完全解決。

    3、安裝Bugzilla
      到官方網(wǎng)站下載Bugzilla
      #tar zxvf bugzilla-2.22-...
      #cd bugzilla-2.22-...
      #./checksetup.pl
      這樣就會檢測出來Perl需要安裝的模塊。然后根據(jù)列出的提示信息下載安裝Perl模塊。(這個比較方便的)而且只需要安裝那些必要的模塊就可以了。
      當
      #./checksetup.pl能正常執(zhí)行完畢時,在當前目錄下就會生成一個文件:localconfig
      然后,需要修改localconfig文件,這樣就可以對Bugzilla的設置進行修改。
    在這里你可以對數(shù)據(jù)庫表名,用戶名和密碼進行配置。
      修改好之后再次運行:
      #./checksetup.pl
      如果正常則表示安裝成功

    4、配置Apache
      配置Apache是一個比較郁悶的事情,因為以前都沒有好好地接觸過Apache。
    如果熟悉Apache的配置文件就很容易了。
      下面給出一些有用的配置:
    配置文件可能是apache2.conf和httpd.conf
    找到文件,然后做以下操作:
    找到
    AddHandler cgi-script .cgi
    把注釋去掉
    添加以下配置
    Alias /bugzilla/ "/usr/local/apache2/cgi-bin/bugzilla/"
    <Directory "/usr/local/apache2/cgi-bin/bugzilla/">
       AddHandler cgi-script .cgi
       Options +Indexes +ExecCGI
       DirectoryIndex index.cgi
       AllowOverride Limit
    </Directory>

    基本上這樣安裝就完全結(jié)束了。

    然后重啟apache
    最后就可以訪問了
    posted @ 2008-08-14 12:30 小馬歌 閱讀(947) | 評論 (0)編輯 收藏
     
     
    <!-- 這些指令組件關閉JMX MBeans支持 -->
    <!-- 你也可以通過包含你自己的mbean描述文件配置自定義的組件,然后設置
          “descriptors”屬性為以“;”為分隔的文件名列表嚴將它添加到默認列表
          中,例如:descriptors="/com/myfirm/mypackage/mbean-descriptor.xml"。
    -->
    <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" debug="0" />
    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" debug="0" />
    <!-- Global JNDI resources -->
    <!-- 全局JNDI資源 -->
    <GlobalNamingResources>
          <!-- 出于示例目的的測試入口 -->
          <Environment name="simpleValue" type="java.lang.Integer" value="30" />
          <!-- 可編輯的,用來通過UserDatabaseRealm認證用戶的用戶數(shù)據(jù)庫 -->
          <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase"
           description="User database that can be updated and saved">
          </Resource>
          <ResourceParams name="UserDatabase">
           <parameter>
            <name>factory</name>
            <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
           </parameter>
           <parameter>
            <name>pathname</name>
            <value>conf/tomcat-users.xml</value>
           </parameter>
          </ResourceParams>
    </GlobalNamingResources>
    <!-- 一個“Service”是一個或多個共用一個單獨“Container”(容器)的“Connectors”
          組合(因此,應用程序在容器中可見)。通常,這個容器是一個“Engine”
          (引擎),但這不是必須的。
          注意:一個“Service”自身不是一個容器,因此,在這個級別上你不可定義
          諸如“Valves”或“Loggers”子組件。
    -->
    <!-- 定義Tomcat的標準獨立服務 -->
    <Service name="Catalina">
          <!-- 一個“Connector”(連接器)代表一個請求被接收和應答所需要的端點。每個連
           接器通過相關的“Container”(容器)處理請求。
           默認情況下,一個非SSL的HTTP/1.1的連接器被綁定在端口8080。你也可以通過
           根據(jù)后面的使用說明并取消第二個連接器入口的注釋,在端口8443上建立一個
           SSL HTTP/1.1的連接器。開放SSL支持需要下面幾步(參見Tomcat 5文檔中怎樣
           配置SSL的說明以取得更多的詳細信息):
           * 如果你的JDK是1.3或1.3以前的版本,下載安裝JSSE 1.0.2或以后版本,并放
           置JAR文件到“$JAVA_HOME/jre/lib/ext”目錄下。
           * 帶一個“changeit”的口令值執(zhí)行:
           %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA (Windows)
           $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA (UNIX)
           來生成它自己的證書私鑰。
           默認情況下,當一個web應用程序調(diào)用請求時,DNS查詢是可行的。這將對性能造
           成一些不利的影響,因此,你可以將“enableLookups”設置為“false”來關閉DNS
           查詢。當DNS查詢被關閉時,request.getRemoteHost()將返回包含遠程客戶IP地
           址的字符串。
          -->
          <!-- 在8080端口上定義一個非SSL的HTTP/1.1連接器 -->
          <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" redirectPort="8443" acceptCount="100"
           debug="0" connectionTimeout="20000" disableUploadTimeout="true" />
          <!-- 注意,要關閉連接超時,將connectionTimeout設置為0 -->
          <!-- 注意:要使用gzip壓縮需要設置如下屬性:
           compression="on"
           compressionMinSize="2048"
           noCompressionUserAgents="gozilla,traviata"
           compressableMimeType="text/html,text/xml"
          -->
          <!-- 在端口8443上定義一個SSL的HTTP/1.1的連接器 -->
          <!--
           <Connector port="8443"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false" disableUploadTimeout="true"
           acceptCount="100" debug="0" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" />
          -->
          <!-- 在端口8009上定義一個Coyote/JK2 AJP 1.3連接器 -->
          <Connector port="8009" enableLookups="false" redirectPort="8443"
           debug="0" protocol="AJP/1.3" />
          <!-- 在8082端口上定義一個代理HTTP/1.1連接器 -->
          <!-- 參見代理文檔以取得這里使用屬性的更多的信息。 -->
          <!--
           <Connector port="8082"
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
           enableLookups="false"
           acceptCount="100" debug="0" connectionTimeout="20000"
           proxyPort="80" disableUploadTimeout="true" />
          -->
          <!-- 一個“Engine”(引擎)代表處理每個請求的入口點(在Catalina內(nèi))。這個Tomcat
           的標準獨立引擎實現(xiàn)分析包含在請求中的HTTP頭信息,并將請求傳送到適當?shù)闹鳈C
           或虛擬主機上。-->
          <!-- 你應該這樣設置jvmRoute以便在JK/JK2通道上支持負載平衡:
           <Engine name="Standalone" defaultHost="localhost" debug="0" jvmRoute="jvm1">
          -->
          <!-- 在我們的容器體系中定義最高級別的容器 -->
          <Engine name="Catalina" defaultHost="localhost" debug="0">
           <!-- 請求轉(zhuǎn)儲器值轉(zhuǎn)儲非常有用的通過Tomcat這個實例接收到的所有請求的,關于
            接收到的請求頭和cookies,以及發(fā)送出的回應頭和cookies的調(diào)試信息。如果
            你只在意一個特定的虛擬主機或者一個特定應用程序的請求,在對應的<Host>
            或<Context>入口中套用這個元素。
            對于所有的Servlet(小服務程序)2.4來所,在示例程序中檢驗
            “RequestDumperFilter”過濾是非常容易的(這個過濾器源代碼可以在
            “$CATALINA_HOME/webapps/examples/WEB-INF/classes/filters”下找到。
            請求轉(zhuǎn)儲默認情況下是關閉的,如果要使用它,取消下面行的注釋符。-->
           <!--
            <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
           -->
           <!-- 全局日志設置,除非在更低的級別上覆蓋它的設置 -->
           <Logger className="org.apache.catalina.logger.FileLogger"
            prefix="catalina_log." suffix=".txt" timestamp="true" />
           <!-- 因為這個Realm(區(qū)域)在這兒,因此這個實例將被全局共享。 -->
           <!-- 這個Realm(區(qū)域)使用在全局JNDI資源下,由“UserDatabase”配置的用戶
            數(shù)據(jù)庫。通過使用Realm將使對于這個用戶數(shù)據(jù)庫的任何編輯都將會立即可用
            <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
            debug="0" resourceName="UserDatabase"/>-->
           <!-- 注釋掉舊有的Realm以便我們能很快速的恢復舊有配置。 -->
           <!--
            <Realm className="org.apache.catalina.realm.MemoryRealm" />
           -->
           <!-- 下面的屬性用于從儲存在數(shù)據(jù)庫或從JDBC通道中得到的Realm以取代上面的
            Realm配置。-->
           <!--
            <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
            driverName="oracle.jdbc.driver.OracleDriver"
            connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
            connectionName="scott" connectionPassword="tiger"
            userTable="users" userNameCol="user_name" userCredCol="user_pass"
            userRoleTable="user_roles" roleNameCol="role_name" />
           -->
           <!--
            <Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
            driverName="sun.jdbc.odbc.JdbcOdbcDriver"
            connectionURL="jdbc:odbc:CATALINA"
            userTable="users" userNameCol="user_name" userCredCol="user_pass"
            userRoleTable="user_roles" roleNameCol="role_name" />
           -->
           <!-- 定義默認的虛擬主機
            注意:XML模式確認將不能與Xerces 2.2同工作。
           -->
           <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true"
            autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
            <!--
             為這個結(jié)點定義一個群集,通過定義這個元素,意味著每個管理員都將被改變。
             因此,當運行一個群集時,只有確認在必須被聚集和移除其他的地方有你的
             web軟件。
             一個群集有下面這些參數(shù):
             className = 這個群集類的全限定名
             name = 你的群集的描述名,可以是任何描述
             debug = 調(diào)試級別,更高意味著更多的輸出
             mcastAddr = 多播地址,所有的節(jié)點都必須有同樣的多播地址
             mcastPort = 多播端口,對所有的節(jié)點都必須有同樣的多播端口
             mcastBindAddr = 綁定多播套接字到一個指定的地址
             mcastTTL = 多播生存期,如果你想要限制你的廣播的話
             mcastSoTimeout = 多播讀取超時
             mcastFrequency = 發(fā)送“I'm alive”(我還活著)信息的間隔毫秒數(shù)
             mcastDropTime = 多長時間沒有收到“I'm alive”就將這個節(jié)點標識為死節(jié)點(單位:毫秒)
             tcpThreadCount = 用于處理重復引入請求的線程數(shù),最好是每個節(jié)點都有相同的線程數(shù)
             tcpListenAddress = 在有多塊以太網(wǎng)卡的主機上的監(jiān)聽TCP群集請求的地址(綁定地址),auto意味著地址由InetAddress.getLocalHost().getHostAddress()取得。
             tcpListenPort = tcp監(jiān)聽端口
             tcpSelectorTimeout = 在操作系統(tǒng)中有java.nio喚醒錯的情況下,使用Selector.select()的超時
             毫秒數(shù)。設為0則沒有超時限制
             printToScreen = true意味著管理員的相關信息也將打印輸出到std.out
             expireSessionsOnShutdown = true 意味著
             useDirtyFlag = true意味著我們只能在調(diào)用setAttribute,removeAttribute后才能復制一個會話;
             false意味著在每個請求后復制會話。
             false意味著復制將以下列代碼方式工作:
             <%
             HashMap map = (HashMap)session.getAttribute("map");
             map.put("key","value");
             %>
             replicationMode = 可以是“pooled”、“synchronous”或者“asynchronous”
             * Pooled意味著在多個套接字上同步進行復制。例如,先復制數(shù)據(jù),然后請求返回。
             這與“synchronous”相同,除了它使用一個套接字池,因此,它是多線程的。它是
             最快和最高級的設置,使用這個配置也增加了處理復制的tcp線程的域。
             * Synchronous指執(zhí)行請求的線程,它也是向其他節(jié)點復制數(shù)據(jù)的線程,并且直到
             所有的節(jié)點都己經(jīng)收到信息后才返回。
             * Asynchronous,對每個群集節(jié)點而言,這是一個特別的“sender”(發(fā)送者)線程,
             因此請求線程將復制請求排隊到一個小隊列中,然后,返回給用戶。
             這個小隊列是一個當會話被添加到隊列中,而從先前的請求中,同一個會話己經(jīng)存在
             ,這個會話將被放置在隊列中以代替重復的兩個請求。這幾乎從不會發(fā)生,除非存在
             較大的網(wǎng)絡延遲。
            -->
            <!-- 當配置群集時,你也添加一個值來捕獲所有傳入的請求,在請求結(jié)束時,這個會話可能被子復制,
             也可能不被復制。一個會話是否復制取決于下列條件是否發(fā)生:
             1. useDirtyFlag為真,或者setAttribute或者removeAttribute己經(jīng)被調(diào)用。
             2. 會話己經(jīng)存在(己經(jīng)被創(chuàng)建了)。
             3. 請求沒有被“filter”屬性所捕獲。
             這個filter(過濾器)屬性用于過濾那些不能修改會話的請求,因此,我們在這個請求結(jié)束后不復制
             會主。這個過濾器是消極的,例如,你向過濾器發(fā)送了一些東西,然后被過濾出去,在那個匹配的過
             濾器上不會發(fā)生復制。
             過濾器屬性以分號為分隔,因此你不能換行,即使你想這么做。
             filter=".*\.gif;.*\.js;"意味著在進行以.gif和.js結(jié)束的URI請求后不復制會話。
            -->
             <!--
             <Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"
             managerClassName="org.apache.catalina.cluster.session.DeltaManager"
             expireSessionsOnShutdown="false"
             useDirtyFlag="true">
             <Membership
             className="org.apache.catalina.cluster.mcast.McastService"
             mcastAddr="228.0.0.4"
             mcastPort="45564"
             mcastFrequency="500"
             mcastDropTime="3000"/>
             <Receiver
             className="org.apache.catalina.cluster.tcp.ReplicationListener"
             tcpListenAddress="auto"
             tcpListenPort="4001"
             tcpSelectorTimeout="100"
             tcpThreadCount="6"/>
             <Sender
             className="org.apache.catalina.cluster.tcp.ReplicationTransmitter"
             replicationMode="pooled"/>
             <Valve className="org.apache.catalina.cluster.tcp.ReplicationValve"
             filter=".*\.gif;.*\.js;.*\.jpg;.*\.htm;.*\.html;.*\.txt;"/>
             </Cluster>
            -->
            <!-- 通常,對每一個應用程序,用戶必須逐個的認證他們自己。當他們遇到被
             某種安全約束所保護的資源時,如果你想讓用戶只在第一次被認證,那么,
             取消下面入口行的注釋,然后在這個虛擬主機中包含這個用戶的,橫跨所有
             web應用程序的用戶身份識別。-->
            <!--
             <Valve className="org.apache.catalina.authenticator.SingleSignOn"
             debug="0"/>
            -->
            <!-- 這個虛擬主機的所有請求的訪問日志過程。默認情況下,日志文件被創(chuàng)建在相對
             于$CATALINA_HOME目錄下的logs目錄下。通過directory屬性,你也可以指定一個
             不同的目錄,如果你想的話。可以使用相對路徑(相對于$CATALINA_HOME),也
             可以使用絕對路徑。-->
            <!--
             <Valve className="org.apache.catalina.valves.AccessLogValve"
             directory="logs" prefix="localhost_access_log." suffix=".txt"
             pattern="common" resolveHosts="false"/>
            -->
            <!-- 與這個虛擬主機有關系所有上下文所共享的日志。默認情況下(使用FileLogger時),
             日志文件被創(chuàng)建在相對于$CATALINA_HOME目錄下的logs目錄下。如果你希望,你也可
             以給directory指定一個不同的路徑。可以使用相對于$CATALINA_HOME的相對路徑,也
             可以使用絕對路徑。-->
            <Logger className="org.apache.catalina.logger.FileLogger" directory="logs"
            prefix="localhost_log." suffix=".txt" timestamp="true" />
    <Context path="web上下文路徑" docBase="虛擬目錄路徑" reloadable="true" debug="0"> </Context>
           </Host>
          </Engine>
    </Service>
    </Server>

    tomcat文件夾的conf\catalina\localhost(對于Tomcat6版本及其以上,需要自己創(chuàng)建catalina和localhost這兩個文件夾)
    增加project .xml文件(該文件名的project要和下面的“path=“/xxx"”的xxx相同)
    文件內(nèi)容:
    <Context path="/project" reloadable="true" docBase="E:\javastudio\oob" workDir="E:\javastudio\oob\work" />
    docBase是項目文件夾的web-inf文件夾的上一層目錄 workDir是指Tomcat解析Jsp轉(zhuǎn)換為Java文件,并編譯為class存放的文件夾,設置在項目文件夾里面,可以避免移植到其他地方首次讀取jsp文件需要重新解析 。一般格式:項目文件夾\work reloadable是指可以重新加載,一般設置為true,方便使用,不需要經(jīng)常重啟Tomcat以后啟動Tomcat,在瀏覽器輸入http://localhost:8080/project就能訪問該項目的welcome文件。

    ***************
    為什么要不修改server.xml呢?在Tomcat6的doc幫助文檔中,官方是不提倡修改server.xml來添加虛擬目錄的!
           而我認為,以上使用的方法,非常方便于項目的移植,移植后,只有修改docBase和workDir的值就行了,甚至可以去掉workDir這個屬性
    posted @ 2008-08-14 11:45 小馬歌 閱讀(1160) | 評論 (0)編輯 收藏
     

    通常,我們?yōu)榱吮苊鈨?nèi)存溢出等問題,需要設置環(huán)境變量
    JAVA_OPTS    -Xms256M -Xmx512M 等,【對于服務器,一般都設置成一樣的】
    但是有的時候可能這樣的設置還會不行(比如,當
    Server應用程序加載較多類時,即jvm加載類時,永久域中的對象急劇增加,從而使jvm不斷調(diào)整永久域大小,為了避免調(diào)整),你可以使用更多的參數(shù)配置,如: java -Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m
    其中,使用   -XX:MaxPerSize標志來增加永久域的大小,-XX:PerSize標志設置初始值

    -XX

    基于 Sun 的 Java 2 Standard Edition(J2SE)5 有生成垃圾回收功能,這允許分隔內(nèi)存池以包含不同時效的對象。垃圾回收循環(huán)根據(jù)時效收集與其他對象彼此獨立的對象。使用其他參數(shù),您可以單獨設置內(nèi)存池的 大小。為了實現(xiàn)更好的性能,您應該對包含短期存活對象的池的大小進行設置,以使該池中的對象的存活時間不會超過一個垃圾回收循環(huán)。新生成的池的大小由 NewSizeMaxNewSize 參數(shù)確定。

    第一次垃圾回收循環(huán)中存活下來的對象轉(zhuǎn)移到另一個池中。生還者池的大小由參數(shù) SurvivorRatio 確定。 如果垃圾回收變成了瓶頸,您可以嘗試定制生成池設置。要監(jiān)控垃圾回收統(tǒng)計信息,使用 Tivoli Performance Viewer 中的對象統(tǒng)計信息或 verbose:gc 配置設置。 輸入下列值:
    -XX:NewSize (lower bound)
    -XX:MaxNewSize (upper bound)
    -XX:SurvivorRatio=NewRatioSize
    -XX:NewSize 320m 此值設大可調(diào)大新對象區(qū),減少Full GC次數(shù)
    -XX:+UseParNewGC :縮短minor收集的時間 可用來設置并行收集【多CPU】
    -XX:+ParallelGCThreads 可用來增加并行度【多CPU】
    -XX:+UseParallelGC 設置后可以使用并行清除收集器【多CPU】-Xss:每個線程的Stack大小


    -verbose:gc 顯示垃圾收集信息

    -Xloggc:gc.log 指定垃圾收集日志文件

    剛剛了解到的一些參數(shù)(待實踐測試)

    -Xmn:young generation的heap大小,一般設置為Xmx的3、4分之一

    -XX:+UseConcMarkSweepGC :縮短major收集的時間

    提示:此選項在Heap Size 比較大而且Major收集時間較長的情況下使用更合適

    下面的命令把整個堆設置成128m,新域比率設置成3,即新域與舊域比例為1:3,新域為堆的1/4或32M:

    java –Xms128m –Xmx128m –XX:NewRatio =3

    缺省值為:NewSize=2m MaxNewSize=32m SurvivorRatio=2。但是,如果 JVM 的堆大小大于 1GB,則應該使用值:-XX:newSize=640m -XX:MaxNewSize=640m -XX:SurvivorRatio=16,或者將堆的總大小的 50% 到 60% 分配給新生成的池。

              舉例:永久域默認大小為4m。運行程序時,jvm會調(diào)整永久域的大小以滿足需要。每次調(diào)整時,jvm會對堆進行一次完全的垃圾收集。

       使用-XX:MaxPerSize標志來增加永久域的大小。在WebLogic Server應用程序加載較多類時,經(jīng)常需要增加永久域的最大值。當jvm加載類時,永久域中的對象急劇增加,從而使jvm不斷調(diào)整永久域大小。為了避免 調(diào)整,可使用-XX:PerSize標志設置初始值。
       下面把永久域初始值設置成32m,最大值設置成64m。
        java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m

    默認狀態(tài)下,HotSpot在新域中使用復制收集器
    。該域一般分為三個部分。第一部分為Eden,用于生成新的對象。另兩部分稱為救助空間,當Eden充 滿時,收集器停止應用程序,把所有可到達對象復制到當前的from救助空間,一旦當前的from救助空間充滿,收集器則把可到達對象復制到當前的to救助 空間。From和to救助空間互換角色。維持活動的對象將在救助空間不斷復制,直到它們獲得使用期并轉(zhuǎn)入舊域。使用-XX:SurvivorRatio可 控制新域子空間的大小。

    目前,我的的開發(fā)環(huán)境 2G內(nèi)存,tomcat+eclipse 大型應用程序
    java -Xmx1024m -XX:PermSize=512m   基本就ok大部分應用了


    我的服務器參數(shù)配置:
    MY_PARAMS="-Xmn340m -Xss128k -XX:NewSize=640m -XX:MaxNewSize=640m -XX:PermSize=512m -XX:MaxPermSize=512m -XX:+UseParNewGC -Xloggc:gc.log"
    posted @ 2008-08-14 11:38 小馬歌 閱讀(1377) | 評論 (0)編輯 收藏
     
    這一段時間,Eclipse總是死掉,幾乎是稍微操作快一點就會死掉,幾分鐘一次,搞得人郁悶至極。浪費了不少時間,在網(wǎng)上搜了下,看到很多朋友也出現(xiàn)類似的情況,在網(wǎng)上求救,但是網(wǎng)上的辦法都只是說通過修改eclipse.ini文件來加大Eclipse的內(nèi)存。
      
       自己試了下,發(fā)現(xiàn)不管用。今天,又死掉了,不過爆出一個經(jīng)常出現(xiàn)的錯誤,大意是:permgen space導致內(nèi)存溢出。實在忍無可忍,上網(wǎng)一搜,發(fā)現(xiàn)網(wǎng)絡真是個好東西,尤其是對我們這種自學者而言,無疑是授業(yè)解惑的良師益友。
      
       這里總結(jié)一下自己的經(jīng)驗和網(wǎng)友的經(jīng)驗,希望能夠?qū)κ艽藛栴}折磨的朋友有所參考價值。
      
      解決辦法如下:
      
      在eclipse.ini配置文件中加上以下兩行
      -XX:PermSize=128M
      -XX:MaxPermSize=128M
      
      加上上2行后,我的eclipse.ini文件如下所示:
      
      -showsplash
      org.eclipse.platform
      --launcher.XXMaxPermSize
      512m
      -vmargs
      -Xms256m
      -Xmx512m
      -XX:PermSize=128M
      -XX:MaxPermSize=128M
      
      這里的內(nèi)存大小根據(jù)自己的物理內(nèi)存情況來決定吧。
      
      從網(wǎng)上的資料看PermSize大一點肯定更好,而且最好是設置PermSize和MaxPermSize一樣大。理由如下:
       PermSize 和MaxPermSize如果設置為相同還可以在一定程度上提高性能,因為,PermSize在不斷的變化中會需要轉(zhuǎn)移其中的數(shù)據(jù)。如果固定了以后,則可以減少每次擴大PermSize帶來的性能損失。
      
      
      
      1、PermGen space簡介
      
      PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域OutOfMemoryError: PermGen space從表面上看就是內(nèi)存益出,解決方法也一定是加大內(nèi)存。
      
      說說為什么會內(nèi)存益出:
      (1)這一部分用于存放Class和Meta的信息,Class在被 Load的時候被放入PermGen space區(qū)域,它和和存放Instance的Heap區(qū)域不同。
      (2) GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS 的話,就很可能出現(xiàn)PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。
      
      如果你的WEB APP下都用了大量的第三方jar,其大小超過了jvm默認的大小(4M)那么就會產(chǎn)生此錯誤信息了。
      
      
      解決方法: 手動設置MaxPermSize大小
      
      修改TOMCAT_HOME/bin/catalina.sh,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入以下行:
       JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
      建議:將相同的第三方jar文件移置到tomcat/shared/lib目錄下,這樣可以減少jar 文檔重復占用內(nèi)存
    posted @ 2008-08-14 11:37 小馬歌 閱讀(160) | 評論 (0)編輯 收藏
     
    一 . 安裝與配置MYSQL
      二 . 常用mysql命令行命令
      1 .mysql的啟動與停止
      啟動MYSQL服務 net start mysql
      停止MYSQL服務 net stop mysql
      2 . netstat –na | findstr 3306 查看被監(jiān)聽的端口 , findstr用于查找后面的端口是否存在
      3 . 在命令行中登陸MYSQL控制臺 , 即使用 MYSQL COMMEND LINE TOOL
       語法格式 mysql –user=root –password=123456 db_name
       或 mysql –u root –p123456 db_name
      4 . 進入MYSQL命令行工具后 , 使用status; 或\s 查看運行環(huán)境信息
      5 . 切換連接數(shù)據(jù)庫的語法 : use new_dbname;
      
      
      6 . 顯示所有數(shù)據(jù)庫 : show databases;
      
      7 . 顯示數(shù)據(jù)庫中的所有表 : show tables;
      
      8 . 顯示某個表創(chuàng)建時的全部信息 : show create table table_name;
      
      9 . 查看表的具體屬性信息及表中各字段的描述
       Describe table_name; 縮寫形式 : desc table_name;
      三 。 MySql中的SQL語句
      1 . 數(shù)據(jù)庫創(chuàng)建 : Create database db_name;
      數(shù)據(jù)庫刪除 : Drop database db_name; 刪除時可先判斷是否存在,寫成 : drop database if exits db_name
      
      2 . 建表 : 創(chuàng)建數(shù)據(jù)表的語法 : create table table_name (字段1 數(shù)據(jù)類型 , 字段2 數(shù)據(jù)類型);
       例 : create table mytable (id int , username char(20));
       刪表 : drop table table_name; 例 : drop table mytable;
      
      8 . 添加數(shù)據(jù) : Insert into 表名 [(字段1 , 字段2 , ….)] values (值1 , 值2 , …..);
      如果向表中的每個字段都插入一個值,那么前面 [ ] 括號內(nèi)字段名可寫也可不寫
       例 : insert into mytable (id,username) values (1,’zhangsan’);
      
      9 . 查詢 : 查詢所有數(shù)據(jù) : select * from table_name;
      查詢指定字段的數(shù)據(jù) : select 字段1 , 字段2 from table_name;
      例 : select id,username from mytable where id=1 order by desc;多表查詢語句------------參照第17條實例
      
      10 . 更新指定數(shù)據(jù) , 更新某一個字段的數(shù)據(jù)(注意,不是更新字段的名字)
      Update table_name set 字段名=’新值’ [, 字段2 =’新值’ , …..][where id=id_num] [order by 字段 順序]
      例 : update mytable set username=’lisi’ where id=1;
      Order語句是查詢的順序 , 如 : order by id desc(或asc) , 順序有兩種 : desc倒序(100—1,即從最新數(shù)據(jù)往后查詢),asc(從1-100),Where和order語句也可用于查詢select 與刪除delete
      
      11 . 刪除表中的信息 :
       刪除整個表中的信息 : delete from table_name;
       刪除表中指定條件的語句 : delete from table_name where 條件語句 ; 條件語句如 : id=3;
      
      12 . 創(chuàng)建數(shù)據(jù)庫用戶
      一次可以創(chuàng)建多個數(shù)據(jù)庫用戶如:
      CREATE USER username1 identified BY ‘password’ , username2 IDENTIFIED BY ‘password’….
      
      13 . 用戶的權限控制:grant
       庫,表級的權限控制 : 將某個庫中的某個表的控制權賦予某個用戶
       Grant all ON db_name.table_name TO user_name [ indentified by ‘password’ ];
      
      14 . 表結(jié)構的修改
      (1)增加一個字段格式:
      alter table table_name add column (字段名 字段類型); ----此方法帶括號
      (2)指定字段插入的位置:
      alter table table_name add column 字段名 字段類型 after 某字段;
      刪除一個字段:
      alter table table_name drop字段名;
      (3)修改字段名稱/類型
      alter table table_name change 舊字段名 新字段名 新字段的類型;
      (4)改表的名字
      alter table table_name rename to new_table_name;
      (5)一次性清空表中的所有數(shù)據(jù)
      truncate table table_name; 此方法也會使表中的取號器(ID)從1開始
      
      15 . 增加主鍵,外鍵,約束,索引。。。。(使用方法見17實例)
      ① 約束(主鍵Primary key、唯一性Unique、非空Not Null)
      ② 自動增張 auto_increment
      ③外鍵Foreign key-----與reference table_name(col_name列名)配合使用,建表時單獨使用
      ④ 刪除多個表中有關聯(lián)的數(shù)據(jù)----設置foreign key 為set null ---具體設置參考幫助文檔
      
      16 . 查看數(shù)據(jù)庫當前引擎
       SHOW CREATE TABLE table_name;
       修改數(shù)據(jù)庫引擎
       ALTER TABLE table_name ENGINE=MyISAM | InnoDB;
      
      17 . SQL語句運用實例:
      --1 建users表
      create table users (id int primary key auto_increment,nikename varchar(20) not null unique,password varchar(100) not null,address varchar(200), reg_date timestamp not null default CURRENT_TIMESTAMP);
      
      --2 建articles表,在建表時設置外鍵
      create table articles (id int primary key auto_increment,content longtext not null,userid int,constraint foreign key (userid) references users(id) on delete set null);
      
      -----------------------------------------------------------------------
      --2.1 建articles表,建表時不設置外鍵
       create table articles (id int primary key auto_increment,content longtext not null,userid int);
      --2.2 給articles表設置外鍵
       alter table articles add constraint foreign key (userid) references users(id) on delete set null;
      ------------------------------------------------------------------------
      
      --3. 向users表中插入數(shù)據(jù),同時插入多條
      insert into users (id,nikename,password,address) values (1,'lyh1','1234',null),(10,'lyh22','4321','湖北武漢'),(null,'lyh333','5678', '北京海淀');
      
      --4. 向article中插入三條數(shù)據(jù)
      insert into articles (id,content,userid) values (2,'hahahahahaha',11),(null,'xixixixixix',10),(13,'aiaiaiaiaiaiaiaiaiaiaiaia',1),(14,'hohoahaoaoooooooooo',10);
      
      --5. 進行多表查詢,選擇users表中ID=10的用戶發(fā)布的所有留言及該用戶的所有信息
      select articles.id,articles.content,users.* from users,articles where users.id=10 and articles.userid=users.id order by articles.id desc;
      
      --6. 查看數(shù)據(jù)庫引擎類型
      show create table users;
      
      --7. 修改數(shù)據(jù)庫引擎類型
      alter table users engine=MyISAM; ---因為users表中ID被設置成外鍵,執(zhí)行此句會出錯
      
      --8. 同表查詢,已知一個條件的情況下.查詢ID號大于用戶lyh1的ID號的所有用戶
      select a.id,a.nikename,a.address from users a,users b where b.nikename='lyh1' and a.id>b.id;
      ------也可寫成
      select id,nikename,address from users where id>(select id from users where nikename='lyh1');
      
      9. 顯示年齡比領導還大的員工:
      select a.name from users a,users b where a.managerid=b.id and a.age>b.age;
      
      查詢編號為2的發(fā)帖人: 先查articles表,得到發(fā)帖人的編號,再根據(jù)編號查users得到的用戶名。
      接著用關聯(lián)查詢.
      select * from articles,users得到笛卡兒積,再加order by articles.id以便觀察
      
      使用select * from articles,users where articles.id=2 篩選出2號帖子與每個用戶的組合記錄
      
      再使用select * from articles,users where articles.id=2 and articles.userid=users.id選出users.id等于2號帖的發(fā)帖人id的記錄.
      
      只取用戶名:select user where user.id=(select userid from articles where article.id =2)
      
      找出年齡比小王還大的人:假設小王是28歲,先想找出年齡大于28的人
      select * from users where age>(select age from users where name='xiaowang');
      *****要查詢的記錄需要參照表里面的其他記錄:
      select a.name from users a,users b where b.name='xiaowang' and a.age>b.age
      
      表里的每個用戶都想pk一下.select a.nickname,b.nickname from users a,users b where a.id>b.id ;
      
      更保險的語句:select a.nickname,b.nickname from (select * from users order by id) a,(se
      lect * from users order by id) b where a.id>b.id ;
      
      再查詢某個人發(fā)的所有帖子.
      select b.* from articles a , articles b where a.id=2 and a.userid=b.userid
      
      說明: 表之間存在著關系,ER概念的解釋,用access中的示例數(shù)據(jù)庫演示表之間的關系.只有innodb引擎才支持foreign key,mysql的任何引擎目前都不支持check約束。
      四、字符集出現(xiàn)錯誤解決辦法
      出現(xiàn)的問題:
      mysql> update users
      -> set username='關羽'
      -> where userid=2;
      ERROR 1366 (HY000): Incorrect string value: '\xB9\xD8\xD3\xF0' for column 'usern
      ame' at row 1
      向表中插入中文字符時,出現(xiàn)錯誤。
      
      mysql> select * from users;
      +--------+----------+
      | userid | username |
      +--------+----------+
      | 2 | ???? |
      | 3 | ???? |
      | 4 | ?í?ù |
      +--------+----------+
      3 rows in set (0.00 sec)
      表中的中文字符位亂碼。
      解決辦法:
      使用命令:
      mysql> status;
      --------------
      mysql Ver 14.12 Distrib 5.0.45, for Win32 (ia32)
      
      Connection id: 8
      Current database: test
      Current user: root@localhost
      SSL: Not in use
      Using delimiter: ;
      Server version: 5.0.45-community-nt MySQL Community Edition (GPL)
      Protocol version: 10
      Connection: localhost via TCP/IP
      Server characterset: latin1
      Db characterset: latin1
      Client characterset: gbk
      Conn. characterset: gbk
      TCP port: 3306
      Uptime: 7 hours 39 min 19 sec
      Threads: 2 Questions: 174 Slow queries: 0 Opens: 57 Flush tables: 1 Open ta
      bles: 1 Queries per second avg: 0.006
      --------------
      查看mysql發(fā)現(xiàn)Server characterset,Db characterset的字符集設成了latin1,所以出現(xiàn)中文亂碼。
      
      mysql> show tables;
      +----------------+
      | Tables_in_test |
      +----------------+
      | users |
      +----------------+
      1 row in set (0.00 sec)
      
      更改表的字符集。
      mysql> alter table users character set GBK;
      Query OK, 3 rows affected (0.08 sec)
      Records: 3 Duplicates: 0 Warnings: 0
      
      查看表的結(jié)構:
      mysql> show create users;
      ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
      corresponds to your MySQL server version for the right syntax to use near 'users
      ' at line 1
      mysql> show create table users;
      +-------+-----------------------------------------------------------------------
      ------------------------------------------------------------------------------+
      | Table | Create Table
      |
      +-------+-----------------------------------------------------------------------
      ------------------------------------------------------------------------------+
      | users | CREATE TABLE `users` (
      `userid` int(11) default NULL,
      `username` char(20) character set latin1 default NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=gbk |
      +-------+-----------------------------------------------------------------------
      ------------------------------------------------------------------------------+
      1 row in set (0.00 sec)
      
      mysql> desc users;
      +----------+----------+------+-----+---------+-------+
      | Field | Type | Null | Key | Default | Extra |
      +----------+----------+------+-----+---------+-------+
      | userid | int(11) | YES | | NULL | |
      | username | char(20) | YES | | NULL | |
      +----------+----------+------+-----+---------+-------+
      2 rows in set (0.02 sec)
      
      這時向表中插入中文然后有錯誤。
      mysql> insert into users values(88,'中文');
      ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column 'usern
      ame' at row 1
      mysql> insert into users values(88,'中文');
      ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column 'usern
      ame' at row 1
      
      還要更改users表的username的字符集。
      mysql> alter table users modify username char(20) character set gbk;
      ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'usern
      ame' at row 1
      mysql> alter table users modify username char(20) character set gbk;
      ERROR 1366 (HY000): Incorrect string value: '\xC0\xEE\xCB\xC4' for column 'usern
      ame' at row 1
      
      因為表中已經(jīng)有數(shù)據(jù),所以更改username字符集的操作沒有成***
      清空users表中的數(shù)據(jù)
      mysql> truncate table users;
      Query OK, 3 rows affected (0.01 sec)
      
      從新更改user表中username的字符集
      mysql> alter table users modify username char(20) character set gbk;
      Query OK, 0 rows affected (0.06 sec)
      Records: 0 Duplicates: 0 Warnings: 0
      
      這時再插入中文字符,插入成***。
      mysql> insert into users values(88,'中文');
      Query OK, 1 row affected (0.01 sec)
      
      mysql> select * from users;
      +--------+----------+
      | userid | username |
      +--------+----------+
      | 88 | 中文 |
      +--------+----------+
      1 row in set (0.00 sec)
      mysql>
    posted @ 2008-08-13 11:20 小馬歌 閱讀(324) | 評論 (0)編輯 收藏
     

    如果你想創(chuàng)建一個只包含一個源程序文件的簡單程序,那么你只需要編譯、連接那一個文件就可以了。如果是一個團隊項目組,有著許多甚至上千個源程序文件,那么要創(chuàng)建一個可執(zhí)行程序的過程就變得更復雜、更耗時。你必須用各種各樣的組件將程序逐步建立起來。

    在微軟或其它一些軟件公司中慣例是:每日構造并做“冒煙測試”。每天都對已完成的源程序進行編譯,然后連接組合成可執(zhí)行的程序,并做“冒煙測試”,以簡單的檢查該執(zhí)行程序在運行時是否會“冒煙”。

    帶來的好處

    雖然這是一個非常簡單的過程,但卻有非常重要的意義:

    1、能最小化集成風險

    項目組可能遇到的一個很大的風險是,項目組成員根據(jù)不同的系統(tǒng)功能各自開發(fā)不同的代碼,但是當這些代碼集成為一個系統(tǒng)的時候,也許系統(tǒng)完成不了預期的功能。這種風險的發(fā)生取決于項目中的這種不兼容性多久才被發(fā)現(xiàn),由于程序界面已經(jīng)發(fā)生了變化,或者系統(tǒng)的主要部分已經(jīng)被重新設計和重新實現(xiàn)了,相應的排錯工作將非常困難和耗時。極端情況下,集成的錯誤可能回導致項目被取消掉。每日構造和冒煙測試可以使這種集成錯誤變得非常小,而且便于解決,防止了很多集成問題的產(chǎn)生。

    2、能減小產(chǎn)品低質(zhì)量的風險

        這種風險是和集成不成功、集成出錯相關聯(lián)的。每天對集成的代碼做一些少量的冒煙測試,即可杜絕項目中那些基本的質(zhì)量問題。通過這種方式,使系統(tǒng)達到一種周知的良好狀態(tài),維護這樣的系統(tǒng)可以防止系統(tǒng)逐步惡化到耗費大量時間排查質(zhì)量問題的地步。

    3、能簡單化錯誤診斷

    當系統(tǒng)每天都進行build和測試時,系統(tǒng)任何一天發(fā)生的錯誤都能夠變得十分精細,便于排查。比如在17日系統(tǒng)還運行正常,18日就出錯了,那么只需要檢查這兩次build之間的代碼變化就可以了。

    4、能極大鼓舞項目組的士氣

    看到產(chǎn)品的不斷成長,能夠極大的鼓舞項目組的士氣,有時甚至不管這個產(chǎn)品到底用來做什么。開發(fā)人員可能會為系統(tǒng)顯示了一個矩形而感到激動。通過每日構造,產(chǎn)品每天進步一點點,保證項目士氣的持續(xù)高漲。

    進行每日構造和冒煙測試

    雖然說這是一個簡單枯燥的活,每天進行build,每天進行測試,但也有著一些值得注意的細節(jié):

    1、每天堅持

    每日構造,最重要的就是“每日”。如Jim McCarthy所說,把每日構造看作是項目的“心跳”,沒有“心跳”的話,項目也就死了(Dynamics of Software Development, Microsoft Press, 1995)。Michael Cusumano and Richard W. Selby描述了另外一種隱含的比喻,把每日構造比作項目的“同步脈沖”(Microsoft Secrets, The Free Press, 1995)。 不同開發(fā)人員寫的代碼在他們的“脈沖”之間肯定都會存在“同步”的差異,但是必須有這樣一個“同步脈沖”,使得這些代碼能夠組合為一個整體。當項目組堅持每天把這些不同的“脈沖”組合到一起的時候,開發(fā)人員脫離整體的情況就會得到極大程度的杜絕。

    有些項目組把這一過程簡化為“每周build一次”。這樣帶來的問題是,某一次build失敗后,可能要回溯好幾周才能找到原因。如果這種情況發(fā)生的話,已經(jīng)得不到經(jīng)常build帶來的好處了。

    2、嚴格檢查每一次build

    要保證每一次build的成功,就必須保證build后的結(jié)果(也可稱為build)是可以正常運行的,如果build不可運行,那么本次build被認為是不成功的,同時應該將修復此次build的工作提高到項目組最高級別來處理。

    對于如何衡量一個build,每一個項目組都會定義一些自己的標準,這些標準需要設定一個嚴格的質(zhì)量級別來處理那些特別嚴重的缺陷,同時也需要具有一定的伸縮性來忽略掉那些微不足道的缺陷,一些不適當?shù)年P心也許會使整個過程舉步為艱。

    一個好的build起碼應該具備以下條件:

    ●能夠成功編譯所有的文件、庫,以及其它相關組件;

    ●能夠成功鏈接所有的文件、庫,以及其它相關組件;

    ●不能存在任何使得系統(tǒng)無法運行或者運行出錯的高級別故障;

    ●當然,必須通過冒煙測試

    3、每天進行冒煙測試

    冒煙測試應該是對整個系統(tǒng)流程從輸入到輸出的完整測試。測試不必是面面俱到的,但是應該能夠發(fā)現(xiàn)系統(tǒng)中較大的問題。冒煙測試應該是足夠充分的,通過了冒煙測試的build就可以認為是經(jīng)過充分測試、足夠穩(wěn)定的。

    不進行冒煙測試的build是沒有太大價值的。冒煙測試就像一個哨兵,在阻止著產(chǎn)品質(zhì)量惡化和集成問題的產(chǎn)生,不進行冒煙測試,每日構造可能會變成浪費時間的練習。

    冒煙測試必須隨著系統(tǒng)的擴充而擴充。最初,冒煙測試可能是非常簡單的,比如驗證系統(tǒng)是否會打印“Hello World”,隨著系統(tǒng)功能的擴充,冒煙測試需要越來越充分。最初的冒煙測試也許只需要幾秒鐘來執(zhí)行,逐漸地,測試可能會花費30分鐘,1小時,甚至更長。

    4、建立一個專門的build小組

        在很多項目組,維護每日構造,并更新冒煙測試用例,會耗費一個人工作的大部分時間。因此在一些大的項目中,這項工作獨立成不止一個人來完成的全職工作。比如在 Windows NT 3.0的研發(fā)中,就有一個由四個全職人員組成的專門的build小組(Pascal Zachary, Showstopper!, The Free Press, 1994)。

    5、為build增加修訂,如果這樣做有意義的話

        一般開發(fā)人員不會每天都經(jīng)常向系統(tǒng)中快速的增加實際的代碼,通常是每隔幾天,他們在開發(fā)好完成某個功能的一套代碼以后,然后集成到整個系統(tǒng)中。

    6、規(guī)定一些導致build失敗的懲罰措施

    很多執(zhí)行每日構造的項目組都會規(guī)定一些懲罰措施,來懲罰那些導致build失敗的行為。從最開始,項目組成員就清楚的知道,build的正常執(zhí)行是項目組的頭等大事。一個失敗的build是項目組的意外,無法成為項目組工作的準則。必須堅持:導致build失敗的同事,必須停下手中的工作,首先來解決build失敗的問題。如果一個項目組的build經(jīng)常失敗的話,久而久之的,再來談build的正確性就沒有意義了。

    有種輕松的懲罰措施,能夠突出解決問題的優(yōu)先性。Some groups give out lollipops to each "sucker" who breaks the build. This developer then has to tape the sucker to his office door until he fixes the problem. 有些項目組會懲罰犯錯的同事戴上山羊角,或者向一個項目基金捐獻5塊錢。

    有些項目組對此的懲罰就有點殘酷了。微軟的開發(fā)人員,在一些知名度很高、很重要的產(chǎn)品如Windows NT,Windows 95,Excel等產(chǎn)品后期研發(fā)中,被要求隨時帶著尋呼機,如果你的代碼導致build失敗的話,即使是凌晨3點鐘,也會要求你立即來處理這個問題。

    7、即使在壓力下也需堅持每日構造和冒煙測試

    當項目進度的壓力越來越大時,維護每日構造的工作看起來有些浪費時間,但是恰恰相反。在壓力之下,開發(fā)人員丟掉一些平時的規(guī)定,會采用一些設計和實現(xiàn)的捷徑,這在平時壓力較小的環(huán)境下一般時不會用的。代碼的review和單元測試也可能會比平時粗心一些,這些代碼的狀態(tài)變化也會比平時快很多。

    為防止這種情況的出現(xiàn),每日構造會堅持相關的規(guī)定,讓壓力下的項目保持在正軌上。代碼仍然每天在不斷變化,但是構造過程使得這種變化每天都可控。

    誰能夠從每日構造這種過程中得到好處呢?一些開發(fā)人員會抗議說,由于他們的項目太大,每天進行build是沒有實際意義的。但是為什么現(xiàn)在最復雜的軟件項目組卻能夠成功的執(zhí)行每日構造的制度呢?本文首發(fā)時,Windows NT包括了560萬行代碼、分布在4萬個源程序文件中,項目組仍然可以堅持每日構造。

    posted @ 2008-08-11 17:12 小馬歌 閱讀(273) | 評論 (0)編輯 收藏
     

    Perl 是一種能完成任務的語言。

    當然,如果你的工作就是寫程序,那么從理論上來講,你可以使用任何“完整”的計算機語言來完成任務。但是從我們的經(jīng)驗來看,計算機語言的區(qū)別很大程度上不在它能干什么,而是在它做事情的時候是否簡單。從一個極端來說,那些所謂的第四代語言做某些事情的時候相當容易,但是做其它一些事情的時候幾乎不可能。從另外一個極端來看,那些所謂的工業(yè)級的語言在做任何事情的時候都幾乎一樣困難。

    Perl 是不同的語言。從一開始,Perl 就設計成可以把簡單工作簡單化,同時又不失去處理困難問題能力的語言。

    那什么是“簡單工作”呢?當然就是那些你每天都要干的。你需要一種可以很容易操作數(shù)字,文本,文件和目錄,計算機和網(wǎng)絡,特別是程序的語言。這種語言應該很容易運行外部的程序并且掃描這些程序的輸出獲取感興趣的東西。而且它還應該很容易能把這些你感興趣的東西交給其它程序做特殊的處理。當然,這種語言還應該很容易在任何現(xiàn)代的操作系統(tǒng)上可以移植地編譯和運行。

    Perl 做到了上述所有需求,甚至更多。

    Perl 最初是當做一種 Unix 的膠水語言設計的,但是她早就移植到大多數(shù)其它操作系統(tǒng)里了。因為 Perl 幾乎可以在任何地方運行,所以 Perl 可以說是當今最具有移植性的編程環(huán)境。要想寫可移植的 C/C++ 程序,你得在程序里加上一大堆 #ifdef 標簽來區(qū)分不同的系統(tǒng)。要想寫可移植的 Java 程序,你必須理解每種新的 Java 實現(xiàn)的特質(zhì)。要想寫可移植的

    shell,你可能要記住每條命令在每種操作系統(tǒng)上的語法,走運的時候你可能可以找到一些公共的東西。而要想寫可移植的 Visual Basic 程序,那么你只需要對“移植”有個更靈活的定義就可以了。

    我們很高興的是 Perl 避免了所有這些問題,同時還保留了這些語言中的許多優(yōu)點,同時還有一些自己的特色。Perl 的特色來自許多方面:它的特性集的工具,Perl 社區(qū)的創(chuàng)造性,以及開源運動的大環(huán)境。不過,許多這些特性都是混合的東西;Perl 的身世復雜,它總是把事物看成是優(yōu)點的不同方面,而不是弱點。Perl 是“背黑鍋我來”的語言。如果你覺得自己陷入一團亂麻之中,非常渴望自由,那么請使用 Perl。

    Perl 是跨文化的。Perl 的爆炸性增長很大程度上是因為那些前 Unix 系統(tǒng)程序員的渴望,他們希望從他們的“老家”帶著盡可能多的東西。對于他們而言,Perl 是可移植的 Unix 文化蒸餾器,是"此路不通"的沙漠中的綠洲。從另外一個角度來看,Perl 還可以從另外一個方向運轉(zhuǎn):在 Windows 上工作的 web 設計者通常會非常開心地發(fā)現(xiàn)他們的 Perl 程序可以不加修改地在 Unix 服務器上跑。

    對于只是喜歡她的人來說,Perl 是實用抽取和報表語言(Practical Extractoin and Report Language)。對那些熱愛她的人而言,她是變態(tài)電子垃圾制造者(Pathologically Electric Rubbish Lister)。在少數(shù)人眼里,Perl 是毫無意義的重復練習。不過世界需要一點點冗余。

    /Files/xiaomage234/perl-zh-third.rar

    posted @ 2008-08-09 14:44 小馬歌 閱讀(277) | 評論 (0)編輯 收藏
    僅列出標題
    共95頁: First 上一頁 82 83 84 85 86 87 88 89 90 下一頁 Last 
     
    主站蜘蛛池模板: 国产亚洲精品a在线观看| 亚洲AV无码专区亚洲AV伊甸园| 国产精品亚洲片在线| 亚洲人成在线播放| 亚洲日韩在线中文字幕综合| 久久国产精品免费看| 国产精品免费看久久久久| 亚洲国产另类久久久精品| 亚洲色无码专区一区| 国产婷婷成人久久Av免费高清| 成年女性特黄午夜视频免费看| 国产亚洲人成A在线V网站| 亚洲国产日韩在线| 久久久久久毛片免费看| 手机在线免费视频| 亚洲AV无码码潮喷在线观看| 色窝窝亚洲av网| 真实国产乱子伦精品免费| 亚洲欧洲国产成人综合在线观看| 亚洲六月丁香六月婷婷色伊人| 国产性生大片免费观看性 | 日本不卡在线观看免费v| 亚洲精品无码乱码成人| 日韩欧美亚洲国产精品字幕久久久| 久草视频在线免费看| 亚洲国产精品13p| 国产精品亚洲自在线播放页码| a在线免费观看视频| 免费国产怡红院在线观看| 亚洲丝袜中文字幕| 国产免费爽爽视频在线观看 | 老司机69精品成免费视频| 四虎影院永久免费观看| 亚洲av乱码一区二区三区香蕉| 成人久久免费网站| www亚洲精品少妇裸乳一区二区| 456亚洲人成在线播放网站| 日韩精品内射视频免费观看| 国产综合精品久久亚洲| 亚洲av无码专区在线电影 | 国产午夜亚洲不卡|