<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>netix1999</title>
    <description></description>
    <link>http://netix1999.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>今天很特别</title>
        <author>netix1999</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://netix1999.javaeye.com">netix1999</a>&nbsp;
          链接：<a href="http://netix1999.javaeye.com/blog/192351" style="color:red;">http://netix1999.javaeye.com/blog/192351</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>距离08年8月8日还有88天</p>
<p>汶川7.8级地震</p>
<p>下午在26楼的办公室里摇摇晃晃的，</p>
<p>很多同事都躲平地上了</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://netix1999.javaeye.com/blog/192351#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 20:05:26 +0800</pubDate>
        <link>http://netix1999.javaeye.com/blog/192351</link>
        <guid>http://netix1999.javaeye.com/blog/192351</guid>
      </item>
      <item>
        <title>封装 java Resultset (一)</title>
        <author>netix1999</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://netix1999.javaeye.com">netix1999</a>&nbsp;
          链接：<a href="http://netix1999.javaeye.com/blog/191577" style="color:red;">http://netix1999.javaeye.com/blog/191577</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>首先说明一下封装Resultset的动机。</p>
<p>java数据库应用比较流行的是用hibernate操作数据库，对于有一群民工手下的IT高级民工来说，</p>
<p>用hibernate确实是一种比较轻松的解决方式。</p>
<p>但在敏捷开发模式下，比如一两个人接个私活什么的，编写hibernate映射文件就变成</p>
<p>无比头痛的一件事。虽然工具可以帮助从数据库中反向生成，但数据库表结构的修改仍然</p>
<p>非常麻烦。</p>
<p>对于熟悉sql和存储过程的开发者来说，直接操作java数据集是比较轻快的解决方式。</p>
<p>但是直接操作数据集，对Connection, Statement, Resultset等对象必须小心翼翼</p>
<p>的关闭，否则服务器一不小心就吐白沫了。与其提心吊胆的关注释放数据库资源对象，不如</p>
<p>把resultset的一系列操作包装起来，省却开发麻烦。</p>
<p>我需要这样的数据库访问类。</p>
<p>查询类 QD：</p>
<p>返回一个查询&nbsp;: new QD(String sql);</p>
<p>获得一个字段&nbsp; new QD(String sql).getString(String fieldName);</p>
<p>new QD(String sql).getInt(int fieldIndex);</p>
<p>...</p>
<p>同时，因为很多情况下，执行一次查询通常只需要取一个字段的值，</p>
<p>每取得一次值后就在QD的类实现中自动关闭查询打开的数据库资源对象，</p>
<p>这样能相当的简化业务实现部分的代码。</p>
<p>如果需要取多个字段的值，那么就用下面的代码</p>
<p>QD qd = new QD(String sql).setContinousGet();</p>
<p>qd.getInt(...);</p>
<p>qd.getDouble(...);</p>
<p>....</p>
<p>qd.close();</p>
<p>遍历QD数据集的方法则简单设计如下<br />QD qd = new QD(String sql).setContinousGet();</p>
<p>while(qd.next()) {</p>
<p>....</p>
<p>}</p>
<p>输出数据集的json字符串[{key1:value1,key2:v2,...}...{..}];</p>
<p>new QD(sql).asJsonObjs();</p>
<p>输出数据集的json数组字符串[[values1,value2,...],...[...]]</p>
<p>new QD(sql).asJsonArray();</p>
<p>另外，还可以考虑实现类似于jbuilder QueryDataSet的lookup字段</p>
<p>下篇再写QD的实现</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://netix1999.javaeye.com/blog/191577#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 21:20:38 +0800</pubDate>
        <link>http://netix1999.javaeye.com/blog/191577</link>
        <guid>http://netix1999.javaeye.com/blog/191577</guid>
      </item>
      <item>
        <title>java 数据库缓冲池(2) 使用c3p0</title>
        <author>netix1999</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://netix1999.javaeye.com">netix1999</a>&nbsp;
          链接：<a href="http://netix1999.javaeye.com/blog/191545" style="color:red;">http://netix1999.javaeye.com/blog/191545</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>c3p0很容易使用的开源专业级jdbc数据库缓冲池。<br />它是sourceforge上的一个开源项目，<br />项目在 <a href="http://sourceforge.net/projects/c3p0">http://sourceforge.net/projects/c3p0</a><br />他的众多特性这里就不一一介绍了。<br />比较爽的一点就是<br />当Connection归还缓冲池时，c3p0会很小心的关闭<br />这条连接打开的Statement和ResultSet,免去了使用时<br />自己动手小心翼翼的关闭。</p>
<p>c3p0使用非常简单，这里给一个例子</p>
<p>package common.db;</p>
<p>import java.sql.Connection;<br />import java.sql.SQLException;<br />import java.util.Properties;</p>
<p><br />import com.mchange.v2.c3p0.ComboPooledDataSource;<br />import com.mchange.v2.c3p0.DataSources;</p>
<p>public final class ConnectionManager {<br />&nbsp;private static ConnectionManager instance;<br />&nbsp;<br />&nbsp;public ComboPooledDataSource ds;<br />&nbsp;private static String c3p0Properties="c3p0.properties";<br />&nbsp; <br />&nbsp;private ConnectionManager() throws Exception {<br />&nbsp;&nbsp;Properties p = new Properties();<br />&nbsp;&nbsp;p.load(this.getClass().getResourceAsStream(c3p0Properties));<br />&nbsp;&nbsp;ds = new ComboPooledDataSource();<br />&nbsp;}<br />&nbsp;<br />&nbsp;public static final ConnectionManager getInstance() {<br />&nbsp;&nbsp;if (instance == null) {<br />&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;instance = new ConnectionManager();<br />&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return instance;<br />&nbsp;}<br />&nbsp;<br />&nbsp;public synchronized final Connection getConnection() {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;return ds.getConnection();<br />&nbsp;&nbsp;} catch (SQLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}</p>
<p>&nbsp;protected void finalize() throws Throwable {<br />&nbsp;&nbsp;DataSources.destroy(ds);&nbsp;//关闭datasource<br />&nbsp;&nbsp;super.finalize();<br />&nbsp;}<br />&nbsp;<br />}</p>
<p>然后在ConnectionManager类的目录下再创建一个配置文件c3p0.properties<br />内容如下：<br />#db login parameters<br />driverClass=com.mysql.jdbc.Driver<br />jdbcUrl=jdbc:mysql://localhost/test?useUnicode=no&amp;characterEncoding=GBK<br />user=test<br />password=test</p>
<p>#pool parameters<br />initialPoolSize=2<br />maxPoolSize=5<br />#maxIdleTime=10<br />#idleConnectionTestPeriod=5<br />autoCommitOnClose=true</p>
<p>完整的配置文件参数参看c3p0的文档</p>
<p>使用connection时很简单<br />Connection conn = ConnectionManager.getInstance().getConnection();<br />... <br />最后 conn.close() 即可，</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://netix1999.javaeye.com/blog/191545#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 19:16:14 +0800</pubDate>
        <link>http://netix1999.javaeye.com/blog/191545</link>
        <guid>http://netix1999.javaeye.com/blog/191545</guid>
      </item>
      <item>
        <title>java数据库缓冲池</title>
        <author>netix1999</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://netix1999.javaeye.com">netix1999</a>&nbsp;
          链接：<a href="http://netix1999.javaeye.com/blog/191494" style="color:red;">http://netix1999.javaeye.com/blog/191494</a>&nbsp;
          发表时间: 2008年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>数据库缓冲池对提高服务器的数据库访问性能有很大的帮助。 </p>
<p>先说说数据库缓冲池的原理 数据库缓冲池可以简单的看成是一个数据库连接Connection的集合，当执行Connection.close()函数时，这条连接并不是真正的关闭，而是归还到缓冲池中。 </p>
<p>由于客户访问服务器的动作大都是间歇性的，同一时刻的并发连接数并不多。如果使用缓冲池技术，仅仅维持少量的数据库连接，就能满足几倍甚至几百倍的用户数 &ldquo;同时&rdquo;访问数据库。 </p>
<p>实现缓冲池的关键就是在Connection.close()函数设置一个钩子。 </p>
<p>你可以简单的把数据库返回的Connection conn包装一下，实现java.sql.Connection接口, Connection接口的所有函数都返回conn对应函数的运行结果。只是在close()函数上做一些改动。 </p>
<p>我们这里用java的动态代理来实现.</p>
<p>首先实现pool类</p>
<p>package connectionpool;</p>
<p>import java.lang.reflect.Proxy;<br />import java.sql.Connection;<br />import java.sql.DriverManager;<br />import java.sql.SQLException;<br />import java.util.Stack;</p>
<p>import test.TestInterface;</p>
<p>public class ConnectionPool {<br />&nbsp;<br />&nbsp;Stack&lt;Connection&gt; st = new Stack&lt;Connection&gt;();&nbsp; //创建一个堆栈，作为池子<br />&nbsp;private static ConnectionPool instance = new ConnectionPool();&nbsp; //单例模式<br />&nbsp;public static int initialPoolSize = 5;<br />&nbsp;public static String dbName = "test";<br />&nbsp;public static String userName = "root";<br />&nbsp;public static String userPasswd = "";<br />&nbsp;<br />&nbsp;private ConnectionPool() {<br />&nbsp;&nbsp;for(int i = 0; i &lt; initialPoolSize; i++)&nbsp; //初始化缓冲池<br />&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;createConnection().close();<br />&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;public synchronized static Connection getConnection() throws Exception {<br />&nbsp;&nbsp;if (instance.st.size() &gt; 0) return instance.st.pop();<br />&nbsp;&nbsp;else return createConnection();<br />&nbsp;}</p>
<p>&nbsp;synchronized static void returnConnection(Connection conn) {<br />&nbsp;&nbsp;instance.st.push(conn);<br />&nbsp;}<br />&nbsp;<br />&nbsp;private static Connection createConnection() throws Exception { //以mysql为例　创建数据库连接<br />&nbsp;&nbsp;String url="jdbc:mysql://localhost/"+dbName+"?user="+userName+"&amp;password="+userPasswd;<br />&nbsp;&nbsp;Class.forName("com.mysql.jdbc.Driver").newInstance();<br />&nbsp;&nbsp;Connection connection=DriverManager.getConnection(url);<br />&nbsp;&nbsp;ConnectionProxy handler = new ConnectionProxy(connection);<br />&nbsp;&nbsp;Connection proxy = (Connection ) Proxy.newProxyInstance(&nbsp; //创建代理<br />&nbsp;&nbsp;&nbsp;&nbsp;connection.getClass().getClassLoader(),<br />&nbsp;&nbsp;&nbsp;&nbsp;connection.getClass().getInterfaces(),handler);<br />&nbsp;&nbsp;return proxy;<br />&nbsp;}<br />}<br />接着实现代理类</p>
<p>package connectionpool;</p>
<p>import java.lang.reflect.InvocationHandler;<br />import java.lang.reflect.Method;<br />import java.sql.Connection;</p>
<p>public class ConnectionProxy implements InvocationHandler{</p>
<p>&nbsp;Connection delegate;&nbsp;<br />&nbsp;ConnectionProxy(Connection delegate) {<br />&nbsp;&nbsp;this.delegate = delegate;<br />&nbsp;}</p>
<p>&nbsp;public Object invoke(Object proxy, Method method, Object[] args)<br />&nbsp;&nbsp;&nbsp;throws Throwable {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if ("close".equals(method.getName())) {&nbsp; //在close函数处设置钩子<br />&nbsp;&nbsp;&nbsp;&nbsp;ConnectionPool.returnConnection((Connection) proxy);&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;//将数据库连接归还缓冲池，跳过了原来的close()函数<br />&nbsp;&nbsp;&nbsp;&nbsp;// 这里的proxy实际上就是Connection的一个代理实例<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;else return method.invoke(delegate, args);<br />&nbsp;&nbsp;} catch (Exception e){<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}</p>
<p>}</p>
<p>使用缓冲池很简单 ConnectionPool.getConnection();</p>
<p>使用完connection后，直接执行close()函数就行了，connection将返回缓冲池中而不是真正的关闭</p>
<p>当然这只是实现了很简单的一个缓冲池，实用化还需要加上其他一些功能</p>
<p>比如关闭idle连接等等</p>
<p>接下来介绍一个实用的java数据库缓冲池 c3p0。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://netix1999.javaeye.com/blog/191494#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 May 2008 16:59:10 +0800</pubDate>
        <link>http://netix1999.javaeye.com/blog/191494</link>
        <guid>http://netix1999.javaeye.com/blog/191494</guid>
      </item>
      <item>
        <title>很好的javascript编辑工具 spket</title>
        <author>netix1999</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://netix1999.javaeye.com">netix1999</a>&nbsp;
          链接：<a href="http://netix1999.javaeye.com/blog/186839" style="color:red;">http://netix1999.javaeye.com/blog/186839</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一直在找支持Ext库的eclipse javascript插件。<br />用过一段时间aptana，不是很稳定，觉得不爽。<br />后来在Jack Slocum的blog中发现了spket，才发现这就是我要的。<br />支持Ext的code complete并附带code api comments。<br /><br />spket官方网站在www.spket.com，目前最新版本是1.6.11<br />下了个压缩包，很庆幸的发现居然没做混淆，呵呵，那就不客气的拿来用了。<br />附件中是破解版。解压到eclipse目录中即可<br /><br />在spket中添加Ext库支持的步骤如下：<br />Watch this Spket IDE Tutorial to see how to easily add Ext code assist (you can point it at the latest /src/ext.jsb to keep code assist up to date with the latest Ext version). The steps are basically: <br />Window → Preferences → Spket → JavaScript Profiles → New <br />Enter “ExtJS” and click OK <br />Select “ExtJS” and click “Add Library”, then choose “ExtJS” from the dropdown <br />Select “ExtJS” and click “Add File”, then choose the “ext.jsb” file in your “./ext-2.x/source” directory <br />Set the new ExtJS profile as the default by selecting it an clicking the “Default” button on the right-hand side of the “JavaScript Profiles” dialog. <br />Restart Aptana <br />Create a new JS file and type: Ext. and you should get the Ext Code completion options.
          <br/><br/>
          <span style="color:red;">
            <a href="http://netix1999.javaeye.com/blog/186839#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 16:21:20 +0800</pubDate>
        <link>http://netix1999.javaeye.com/blog/186839</link>
        <guid>http://netix1999.javaeye.com/blog/186839</guid>
      </item>
  </channel>
</rss>