??xml version="1.0" encoding="utf-8" standalone="yes"?>一区二区三区亚洲视频,亚洲国产精品无码一线岛国,国产AⅤ无码专区亚洲AVhttp://www.tkk7.com/ioriqw/category/10448.html在中国商界、尤其是互联|界Q另一?0后”青q正在集体Q出水面,以你可能想都想不到的方式崛v?/description>zh-cnWed, 28 Feb 2007 23:20:37 GMTWed, 28 Feb 2007 23:20:37 GMT60hibernate数据?/title><link>http://www.tkk7.com/ioriqw/articles/51136.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Wed, 07 Jun 2006 07:20:00 GMT</pubDate><guid>http://www.tkk7.com/ioriqw/articles/51136.html</guid><wfw:comment>http://www.tkk7.com/ioriqw/comments/51136.html</wfw:comment><comments>http://www.tkk7.com/ioriqw/articles/51136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ioriqw/comments/commentRss/51136.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ioriqw/services/trackbacks/51136.html</trackback:ping><description><![CDATA[ <div id="vz55zx3" class="postbody"> <p>Hibernate内嵌了对C3P0,Proxool,JNDI数据源等数据库连接池的支持。但当我们需要用除了这几个数据源外的其他数据源的时候就有问题了Q例如我们需要用Apache的开源连接池目DBCPQ或者说我们惌使用多数JDBC驱动E序中自带的XxxxDataSourceӞHibernate没有提供对q方面的支持。庆q的是Hibernate做ؓ一个强大的数据持久层组Ӟ它在实现数据库连接方面的扩展性也是非常强大的。本文将介绍两种如何在Hibernate目中用自定义数据源的Ҏ?/p> <p>本文假设你已l有Hibernate的开发经验?/p> <p>在开始之前应该先明确你的目中的具体情况Q也是认Hibernate内嵌的组件是否真的无法支持你的应用需要。例如C3P0或者Proxool已经可以满大部分数据库的需要,又或者你的数据源是在应用服务器中配置的,那么你也没有必要q行扩展Q你可以直接使用DatasourceConnectionProvider来让Hibernate使用你所定义的数据源?/p> <p>那么什么时候你需要扩展HibernateҎ据源的支持呢Q可能你永远也用不上Q但我一直在用。我用的原因可能不能成ؓ正当的理由,因ؓC3P0或者ProxoolL些小地方的不我不爽,个h更偏向于DBCPq接池。或许本文应该改名ؓ《让Hibernate支持DBCP数据源》,其实DBCP只不q是我的一个具体的例子Q本文具有更普遍的应用意义。下面我们具体介l两U不同的扩展思\?/p> <p> <a name="IDAHCOIB"> <span id="1151t1j" class="atitle"> <font color="#1d58d1"> <font face="Arial">思\一Q用外部定义数据源</font> </font> </span> </a> </p> <p>假设我们已经有了一个WEB目Q该目采用了Struts框架Q而且我们已经在Struts中配|了数据源,也有不少的代码是依赖q个数据源运行的。现在我们需要给目中加入对Hibernate的支持,但又不想MҎ的已l成功稳定运行的代码了。那我们该怎么办?如果同样在Hibernate配置一个数据源指到同一个数据库Q相信你也不乐意q样qԌ因ؓ一旦配|上有修攚w么Struts和Hibernate的配|都需要修改,q个也只是麻烦一点而已Q最要命的是没法让原有的代码和Hibernateq一个数据库q接Q因此事务处理也无从谈赗?/p> <p>说那么多理由Q无非就是ؓ了让Hibernate可以使用Struts中配|的数据源,而我们暂且不去考虑q是否是最好的解决Ҏ?/p> <p>在Hibernate中有一个UserSuppliedConnectionProviderc,其实q个cM么也不干Q你一旦让它干点啥吧,它还净出异常,搞得你很是恼火。在Hibernate中,q个cȝ含义是要求用戯己来提供数据库连接的获取ҎQ同时当然也要自p责关闭连接?/p> <p>Z使用Struts中配|的数据源,我们׃能直接调用SessionFactory.openSession()Ҏ来获取Session实例Q因Z如果没有在Hibernate中配|Q何的数据库连接,那Hibernate会默认让UserSuppliedConnectionProvidercL跟你捣ؕQ你会收到很多异怿息,反复提醒我们必须自己提供数据库连接!我们要做q是调用openSessionҎQ不同的是需要先从Struts的数据源中获取数据库q接Q然后传递该q接lopenSessionҎQ参?SessionFactory.openSession(Connection) ҎQ?/p> <p>下面是我写的一个代码片?/p> <br /> <a name="IDARCOIB"> <b> </b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <font face="Lucida Console">//获取Session实例 public Session getSession(){ ServletContext contxt = .... SessionFactory sessions = .... DataSource ds = (DataSource)context.getAttribute(Globals.DATA_SOURCE_KEY); final Connection conn = ds.getConnection(); return sessions.openSession(conn); } //释放Session public void closeSession(Session ssn){ ssn.connection().close(); ssn.close(); } </font> </code> </pre> </td> </tr> </tbody> </table> <br /> <p>需要提醒大家注意的是closeSessionҎQ在该方法中我们必须手工d闭session对应的数据库q接Q我们前面已l提CQUserSuppliedConnectionProvidercd是要求用戯己提供数据库q接已经q接的关闭。如果没有调用ssn.connection().close()ҎQ这会导致Struts的数据源的连接没有被释放?/p> <p>同理Q上面提到的Struts只是一个应用普遍的例子Q实际中你可以用Q何的外部q接池,你只需要将获取到的数据库连接传递给openSessionҎQƈ自行负责释放数据库连接即可。应该说q是一U最单的思\Q好处是对系l的变动最,兼容原来的代码?/p> <br /> <table cellspacing="0" cellpadding="0" width="100%" border="0"> <tbody> <tr> <td> <img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="567" /> </td> </tr> </tbody> </table> <table class="no-print" cellspacing="0" cellpadding="0" align="right"> <tbody> <tr align="right"> <td> <table cellspacing="0" cellpadding="0" border="0"> <tbody> <tr> <td valign="center"> <img height="16" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /> <br /> </td> <td valign="top" align="right"> <a class="fbox" > <b> <font color="#996699">回页?/font> <font color="#1d58d1"> </font> </b> </a> </td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <br /> <br /> <p> <a name="IDA0COIB"> <span id="j3555nf" class="atitle"> <font color="#1d58d1"> <font face="Arial">思\二:扩展ConnectionProvider</font> </font> </span> </a> </p> <p>Hibernate本n是通过ConnectionProvider接口来实现管理数据库q接的。例如其自带的C3P0ConnectionProviderQProxoolConnectionProvider{?/p> <p>在这个思\中,我们希望可以直接在Hibernate的配|文件中配置数据库连接,也就是让Hibernate独揽数据库的理Q真正做到各司其职。ؓ了更了解该接口的使用Q你不妨阅读一下Hibernate提供的上面几个类的源码?/p> <p>接下来我们需要编写一个实CConnectionProvider接口的类Q要求这个类能支持Q何的W合DataSource接口规范的数据源Q同时在Hibernate的配|文件中q行参数的设定。首先我们假定我们的cd是DataSourceConnProviderQ那我们的配|信息在hibernate.cfg.xml中看h应该像下面一?/p> <br /> <a name="IDACDOIB"> <b> </b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <font face="Lucida Console"> <!-- Connection Pool settings --> <property name="connection.provider_class"> com.liusoft.dlog4j.db.DataSourceConnProvider</property> <property name="dscp.datasource">org.apache.commons.dbcp.BasicDataSource</property> <property name="dscp.driverClassName">sun.jdbc.odbc.JdbcOdbcDriver</property> <property name="dscp.url">jdbc:odbc:dlog4j</property> <property name="dscp.username">admin</property> <property name="dscp.password"></property> <property name="dscp.initialSize">1</property> <property name="dscp.maxActive">200</property> <property name="dscp.maxWait">2000</property> <property name="dscp.defaultAutoCommit">false</property> <property name="dscp.defaultReadOnly">false</property> <property name="dscp.removeAbandoned">true</property> <property name="dscp.removeAbandonedTimeout">120</property> <!-- <property name="dscp.defaultTransactionIsolation">1</property> --> <property name="dscp.poolPreparedStatements">true</property> <property name="dscp.maxOpenPreparedStatements">1000</property> </font> </code> </pre> </td> </tr> </tbody> </table> <br /> <p>在上面的配置信息中,connection.provider_class是Hibernate本n用来指定不同ConnectionProvider实现cR接下来我们规定了我们的扩展所使用的配|键值都是以dscp.开_同时我们使用dscp.datasource来指定具体实CDataSource接口的类名,例如如果使用DBCPq个q接池,那么q个cd应该是org.apache.commons.dbcp.BasicDataSource。对于其他以dscp.开头的且不是dscp.datasource的配|信息都会直接赋值给DataSource的实现类。例如上面的配置中,driverClassName、url、username、password{配|信息都是BasicDataSourcecȝ属性?/p> <p>下面是我们所实现的DataSourceConnProvidercȝ源码?/p> <br /> <a name="IDALDOIB"> <b> </b> </a> <br /> <table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1"> <tbody> <tr> <td> <pre> <code class="section"> <font face="Lucida Console">package com.liusoft.dlog4j.db; import java.lang.reflect.Method; import java.sql.Connection; import java.sql.SQLException; import java.util.Iterator; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.beanutils.BeanUtils; import org.hibernate.HibernateException; import org.hibernate.connection.ConnectionProvider; import com.liusoft.dlog4j.Globals; import com.liusoft.dlog4j.util.StringUtils; /** * 让Hibernate支持各种数据? * @author Winter Lau */ public class DataSourceConnProvider implements ConnectionProvider { private final static String BASE_KEY = "dscp."; private final static String ENCODING_KEY = "dscp.encoding"; private final static String DATASOURCE_KEY = "dscp.datasource"; protected DataSource dataSource; /* (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#configure(java.util.Properties) */ public void configure(Properties props) throws HibernateException { String dataSourceClass = null; Properties new_props = new Properties(); Iterator keys = props.keySet().iterator(); while(keys.hasNext()){ String key = (String)keys.next(); if(DATASOURCE_KEY.equalsIgnoreCase(key)){ dataSourceClass = props.getProperty(key); } else if(key.startsWith(BASE_KEY)){ String value = props.getProperty(key); value = StringUtils.replace(value, "{DLOG4J}", Globals.WEBAPP_PATH); new_props.setProperty(key.substring(BASE_KEY.length()), value); } } if(dataSourceClass == null) throw new HibernateException("Property 'dscp.datasource' no defined."); try { dataSource = (DataSource)Class.forName(dataSourceClass).newInstance(); BeanUtils.populate(dataSource, new_props); } catch (Exception e) { throw new HibernateException(e); } } /* (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#getConnection() */ public Connection getConnection() throws SQLException { final Connection conn = dataSource.getConnection(); if(useProxy && conn!=null){ return (new _Connection(conn,encoding)).getConnection(); } return conn; } /* (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#closeConnection(java.sql.Connection) */ public void closeConnection(Connection conn) throws SQLException { if(conn!=null && !conn.isClosed()) conn.close(); } /* (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#close() */ public void close() throws HibernateException { if(dataSource != null) try { Method mClose = dataSource.getClass().getMethod("close",null); mClose.invoke(dataSource, null); } catch (Exception e) { throw new HibernateException(e); } dataSource = null; } /* (non-Javadoc) * @see org.hibernate.connection.ConnectionProvider#supportsAggressiveRelease() */ public boolean supportsAggressiveRelease() { return false; } } </font> </code> </pre> </td> </tr> </tbody> </table> <br /> <p>在DataSourceConnProvidercMQconfigureҎ会在Hibernateq行初始化的q程中被调用Q我们根据配|的DataSourcecd创徏数据源实例,q将配置参数赋值给该实例后卛_成了数据源的初始化。接下来是实现了getConnection和closeConnectionҎ分别是获取数据库q接和关闭连接的Ҏ。方法close用来关闭整个数据源,该方法会在Hibernate释放时被调用?/p> <p>你也可以使用其他一些不同的数据源而不一定非是DBCP数据源。配|完毕后接下来的事情q单了Q直接调用SessionFactory.openSession()Ҏ获取Session实例Q直接调用session.close()释放该实例,无需再手工去关闭session所装的connection接口?/p> <p>相比较上面两U思\而言Q各有千U。如果你真的有必要扩展HibernateҎ据源的支持,如果你没有兼Ҏ代码q个问题需要考虑的话Q那我更們֐于第二种思\。因为它使得整个目的各个层ơ分工非常清晎ͼ而且除了ConnectionProvider cM外应用的代码也相对简单?/p> </div> <img src ="http://www.tkk7.com/ioriqw/aggbug/51136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-06-07 15:20 <a href="http://www.tkk7.com/ioriqw/articles/51136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无需容器的对象关pL?/title><link>http://www.tkk7.com/ioriqw/articles/46885.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Thu, 18 May 2006 12:03:00 GMT</pubDate><guid>http://www.tkk7.com/ioriqw/articles/46885.html</guid><wfw:comment>http://www.tkk7.com/ioriqw/comments/46885.html</wfw:comment><comments>http://www.tkk7.com/ioriqw/articles/46885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ioriqw/comments/commentRss/46885.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ioriqw/services/trackbacks/46885.html</trackback:ping><description><![CDATA[     摘要: 如果兛_开发h员的最新热点,那么您可能听说过 IOC Q控制倒置QInversion of ControlQ容器和 AOP Q面向方面编E)。不q,像许多开发h员一P您可能不清楚在自q开发工作中如何使用q些技术。在本文中,通过具体介绍使用 Hibernate ?Spring 在企业应用程序中构徏一个事务持久层Q您会认识到q些技术? Hibernate ?Java ...  <a href='http://www.tkk7.com/ioriqw/articles/46885.html'>阅读全文</a><img src ="http://www.tkk7.com/ioriqw/aggbug/46885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-05-18 20:03 <a href="http://www.tkk7.com/ioriqw/articles/46885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateSessionFactory properties文g的加?/title><link>http://www.tkk7.com/ioriqw/articles/46857.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Thu, 18 May 2006 08:50:00 GMT</pubDate><guid>http://www.tkk7.com/ioriqw/articles/46857.html</guid><wfw:comment>http://www.tkk7.com/ioriqw/comments/46857.html</wfw:comment><comments>http://www.tkk7.com/ioriqw/articles/46857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ioriqw/comments/commentRss/46857.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ioriqw/services/trackbacks/46857.html</trackback:ping><description><![CDATA[ <p>package com.zte.hibernate.dao;</p> <p>import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.util.Properties;</p> <p>import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.cfg.Configuration;</p> <p>import com.zte.hibernate.domain.Dept;<br />import com.zte.hibernate.domain.Emp;</p> <p>/**<br /> * Configures and provides access to Hibernate sessions, tied to the<br /> * current thread of execution.  Follows the Thread Local Session<br /> * pattern, see <a href="mailto:{@link">{@link</a><a >http://hibernate.org/42.html</a>}.<br /> */<br />public class HibernateSessionFactory {</p> <p>    /** <br />     * Location of hibernate.cfg.xml file.<br />     * NOTICE: Location should be on the classpath as Hibernate uses<br />     * #resourceAsStream style lookup for its configuration file. That<br />     * is place the config file in a Java package - the default location<br />     * is the default Java package.<br><br><br />     * Examples: <br><br />     * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml". <br />     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code> <br />     */<br />    private static String CONFIG_FILE_LOCATION = "/com/zte/hibernate/dao/hibernate.cfg.xml";</p> <p>    /** Holds a single instance of Session */<br /> private static final ThreadLocal threadLocal = new ThreadLocal();</p> <p>    /** The single instance of hibernate configuration */<br />    private static final Configuration cfg = new Configuration();</p> <p>    /** The single instance of hibernate SessionFactory */<br />    private static org.hibernate.SessionFactory sessionFactory;</p> <p>    /**<br />     * Returns the ThreadLocal Session instance.  Lazy initialize<br />     * the <code>SessionFactory</code> if needed.<br />     *<br />     *  @return Session<br />     *  @throws HibernateException<br />     */<br />    public static Session currentSession() throws HibernateException {<br />        Session session = (Session) threadLocal.get();<br />        Properties p = new Properties();<br />        InputStream in;<br />  try {<br />   in = new FileInputStream("src/hibernate.properties");<br />   p.load(in);<br />  } catch (FileNotFoundException e1) {<br />   // TODO Auto-generated catch block<br />   e1.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />        <br />  if (session == null || !session.isOpen()) {<br />   if (sessionFactory == null) {<br />    try {<br />     cfg.setProperties(p);<br />     cfg.addClass(Dept.class);<br />     cfg.addClass(Emp.class);<br />     //cfg.configure(CONFIG_FILE_LOCATION);<br />     sessionFactory = cfg.buildSessionFactory();<br />    } catch (Exception e) {<br />     System.err<br />       .println("%%%% Error Creating SessionFactory %%%%");<br />     e.printStackTrace();<br />    }<br />   }<br />   session = (sessionFactory != null) ? sessionFactory.openSession()<br />     : null;<br />   threadLocal.set(session);<br />  }</p> <p>        return session;<br />    }</p> <p>    /**<br />     *  Close the single hibernate session instance.<br />     *<br />     *  @throws HibernateException<br />     */<br />    public static void closeSession() throws HibernateException {<br />        Session session = (Session) threadLocal.get();<br />        threadLocal.set(null);</p> <p>        if (session != null) {<br />            session.close();<br />        }<br />    }</p> <p>    /**<br />     * Default constructor.<br />     */<br />    private HibernateSessionFactory() {<br />    }</p> <p>}<br /></p> <img src ="http://www.tkk7.com/ioriqw/aggbug/46857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-05-18 16:50 <a href="http://www.tkk7.com/ioriqw/articles/46857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate.cglib.use_reflection_optimizer=falsehttp://www.tkk7.com/ioriqw/articles/46853.html崛v的程序员崛v的程序员Thu, 18 May 2006 08:34:00 GMThttp://www.tkk7.com/ioriqw/articles/46853.htmlhttp://www.tkk7.com/ioriqw/comments/46853.htmlhttp://www.tkk7.com/ioriqw/articles/46853.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/46853.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/46853.htmlhibernate.cglib.use_reflection_optimizer=false - -                                      

set hibernate.cglib.use_reflection_optimizer=false for more info

今天到

HibernateDBModel Error: exception setting property value with CGLIB

(set hibernate.cglib.use_reflection_optimizer=false for more info)

setter of com.belief.po.Good.setTuijian

解决办法

你的数据库里的某个字D늚gؓNULLQ而事情本不该q样的。解决的办法是把这个字D늚NULL值改为非NULL|是查找数据库,看看是否又字DؓnullQ改成非null卛_。(i use sqlserverQ?/p>

]]>
图解eclipse+myelcipse开发EJB http://www.tkk7.com/ioriqw/articles/46662.html崛v的程序员崛v的程序员Wed, 17 May 2006 09:43:00 GMThttp://www.tkk7.com/ioriqw/articles/46662.htmlhttp://www.tkk7.com/ioriqw/comments/46662.htmlhttp://www.tkk7.com/ioriqw/articles/46662.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/46662.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/46662.html 图解eclipse+myelcipse开发EJB     在开发ejb之前Q我们先得配|好服务器,我用的是Weblogic9.0中文版,关于Weblogic9.0配置L我的另一片文章?a class="singleposttitle" id="viewpost1_TitleUrl" href="/rickhunter/articles/25479.html">配置Weblogic9.0
   
    首先需要配|好eclipse。我q里主要说明weblogic的配|?br />    ejb19.jpg

    注意JDK选择JDK5.0的版本?/font>
   
    Zweblogic8的配|也贴上来,供大家比较参?br />    ejb18.jpg
   
    注意weblogic8的JDK版本必须是JDK1.4?/font>
   
    接下来就开始我们的开发了?br />
ejb1.jpg

ejb2.jpg

ejb3.jpg

ejb4.jpg

ejb5.jpg

下面是SessionBean的代?br />
30

其实是修改了其中的一个方法:
 1 /**
 2      * An example business method
 3      *
 4      * @ejb.interface-method view-type = "remote"
 5      * 
 6      * @throws EJBException Thrown if method fails due to system-level error.
 7      */
 8     public String hello() throws EJBException {
 9         // rename and start putting your business logic here
10         return new String("HelloEJBWorld!");
11     }
注意Q代码中的解释文字不要删除,因ؓXDoclet需要?/u>

配置属?br />ejb6.jpg

dweblogic.jar。我的\径是Qbea\weblogic90\server\lib\weblogic.jar
ejb16.jpg

ejb7.jpg

ejb8.jpg

ejb9.jpg

ejb10.jpg

ejb11.jpg

ejb12.jpg

ejb13.jpg

ejb14.jpg

ejb15.jpg

׃来写EJBTestc:
 1 package com;
 2 
 3 import java.rmi.RemoteException;
 4 import java.util.Properties;
 5 
 6 import javax.ejb.CreateException;
 7 import javax.naming.Context;
 8 import javax.naming.InitialContext;
 9 import javax.naming.NamingException;
10 
11 import com.interfaces.HelloWorld;
12 import com.interfaces.HelloWorldHome;
13 
14 public class EJBTest {
15 
16     /**
17      * @param args
18      */
19     public static void main(String[] args) {
20         // TODO 自动生成Ҏ存根
21         Properties properties=new Properties();
22         properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
23         properties.setProperty(Context.PROVIDER_URL,"t3://localhost:7001");
24         
25         Context context;
26         try {
27             context = new InitialContext(properties);
28             HelloWorldHome hwh=(HelloWorldHome)context.lookup("ejb/HelloWorld");
29             HelloWorld hw=hwh.create();
30             String s=hw.hello();
31             System.out.println(s);
32         } catch (NamingException e) {
33             // TODO 自动生成 catch ?/span>
34             e.printStackTrace();
35         } catch (RemoteException e) {
36             // TODO 自动生成 catch ?/span>
37             e.printStackTrace();
38         } catch (CreateException e) {
39             // TODO 自动生成 catch ?/span>
40             e.printStackTrace();
41         }
42         
43     }
44 
45 
46 }
47 


最后就是看l果了,先启动weblogicQ然后运行EJBTestE序?br />
ejb17.jpg










]]>
JDBC+HibernateBlob数据写入Oracle http://www.tkk7.com/ioriqw/articles/46451.html崛v的程序员崛v的程序员Tue, 16 May 2006 09:57:00 GMThttp://www.tkk7.com/ioriqw/articles/46451.htmlhttp://www.tkk7.com/ioriqw/comments/46451.htmlhttp://www.tkk7.com/ioriqw/articles/46451.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/46451.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/46451.htmlOracle的Blob字段比较ҎQ他比long字段的性能要好很多Q可以用来保存例如图片之cȝ二进制数据?

  写入Blob字段和写入其它类型字D늚方式非常不同Q因为Blob自n有一个cursorQ你必须使用cursor对blobq行操作Q因而你在写入Blob之前Q必获得cursor才能q行写入Q那么如何获得Blob的cursor呢?

  q需要你先插入一个empty的blobQ这创Z个blob的cursorQ然后你再把q个empty的blob的cursor用select查询出来Q这样通过两步操作Q你p得了blob的cursorQ可以真正的写入blob数据了?br />
  看下面的JDBC的demoQ把oraclejdbc.jarq个二进制文件写入数据库表javatest的content字段(q是一个blob型字D?

import java.sql.*;
import java.io.*;
import oracle.sql.*;
public class WriteBlob {

public static void main(String[] args) {

 try {
  DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
  Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");
  conn.setAutoCommit(false);

  BLOB blob = null;

  PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");
  pstmt.setString(1,"fankai");
  pstmt.executeUpdate();
  pstmt.close();

  pstmt = conn.prepareStatement("select content from javatest where name= ? for update");
  pstmt.setString(1,"fankai");
  ResultSet rset = pstmt.executeQuery();
  if (rset.next()) blob = (BLOB) rset.getBlob(1);

  String fileName = "oraclejdbc.jar";
  File f = new File(fileName);
  FileInputStream fin = new FileInputStream(f);
  System.out.println("file size = " + fin.available());

  pstmt = conn.prepareStatement("update javatest set content=? where name=?");

  OutputStream out = blob.getBinaryOutputStream();

  int count = -1, total = 0;
  byte[] data = new byte[(int)fin.available()];
  fin.read(data);
  out.write(data);
  /*
  byte[] data = new byte[blob.getBufferSize()]; 另一U实现方?节省内存
  while ((count = fin.read(data)) != -1) {
   total += count;
   out.write(data, 0, count);
  }
  */

  fin.close();
  out.close();

  pstmt.setBlob(1,blob);
  pstmt.setString(2,"fankai");

  pstmt.executeUpdate();
  pstmt.close();

  conn.commit();
  conn.close();
 } catch (SQLException e) {
   System.err.println(e.getMessage());
  e.printStackTrace();
 } catch (IOException e) {
  System.err.println(e.getMessage());
 }
}

}

  仔细看上例,分三步:

  1、插入空blob

into javatest(name,content) values(?,empty_blob());

  2、获得blob的cursor

select content from javatest where name= ? for update;

  注意Q!Q必dfor updateQ这锁定该行,直至该行被修改完毕,保证不生ƈ发冲H?br />
  3、update javatest set content=? where name=

  用cursor往数据库写数据

  q里面还有一点要提醒大家Q?br />
  JDK1.3带的JDBC2.0规范是不完善的,只有读Blob的接口,而没有写Blob的接口,JDK1.4带的JDBC3.0加入了写Blob的接口。你可以使用JDBC3.0的接口,也可以直接用Oracle的JDBC的APIQ我在上例中使用了Oracle的JDBC的API?br />
  另外要注意的是:

java.sql.Blob

oracle.sql.BLOB

  注意看blob的大写Q是不一L。写E序的时候不要搞混了?br />
  下面看看用Hibernate怎么写,原理是一LQ也要分三步Q但是代码简单很?br />
  q是Cat对象定义

package com.fankai;

import java.sql.Blob;

public class Cat {
 private String id;
 private String name;
 private char sex;
 private float weight;
 private Blob image;
 public Cat() { }

 public String getId() { return id; }
 public void setId(String id) { this.id = id; }

 public String getName() { return name; }
 public void setName(String name) { this.name = name; }

 public char getSex() { return sex; }
 public void setSex(char sex) { this.sex = sex; }

 public float getWeight() { return weight; }
 public void setWeight(float weight) { this.weight = weight; }

 public Blob getImage() { return image; }
 public void setImage(Blob image) { this.image = image;}
}

  q是Cat.hbm.xml

Q?xml version="1.0"?Q?br />Q?DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"Q?br />
Qhibernate-mappingQ?br />Qclass name="com.fankai.Cat" table="cat"Q?br />Q?--jcs-cache usage="read-only"/--Q?br />Qid name="id" unsaved-value="null"Q?br />Qgenerator class="uuid.hex"/Q?br />Q?idQ?br />Qproperty name="name" length="16" not-null="true"/Q?br />Qproperty name="sex" length="1" not-null="true"/Q?br />Qproperty name="weight" /Q?br />Qproperty name="image" /Q?br />Q?classQ?br />Q?hibernate-mappingQ?/td>

  下面是完整的用Hibernate写入Blob的例子,相比JDBCQ已l简单轻村֤了,也不用写那些OracleҎ的sql了:

package com.fankai;

import java.sql.Blob;
import net.sf.hibernate.*;
import oracle.sql.*;
import java.io.*;

public class TestCatHibernate {
 public static void testBlob() {
  Session s = null;
  byte[] buffer = new byte[1];
  buffer[0] = 1;
  try {
   SessionFactory sf = HibernateSessionFactory.getSessionFactory();
   s = sf.openSession();
   Transaction tx = s.beginTransaction();
   Cat c = new Cat();
   c.setName("Robbin");
   c.setImage(Hibernate.createBlob(buffer));
   s.save(c);
   s.flush();
   s.refresh(c, LockMode.UPGRADE);
   BLOB blob = (BLOB) c.getImage();
   OutputStream out = blob.getBinaryOutputStream();
   String fileName = "oraclejdbc.jar";
   File f = new File(fileName);
   FileInputStream fin = new FileInputStream(f);
   int count = -1, total = 0;
   byte[] data = new byte[(int)fin.available()];
   fin.read(data);
   out.write(data);
   fin.close();
   out.close();
   s.flush();
   tx.commit();

  } catch (Exception e) {
   System.out.println(e.getMessage());
  } finally {
   if (s != null)
   try {
    s.close();
   } catch (Exception e) {}
  }
 }
}
作者的其他文章
more..
其他相关文章
more...
热点文章


  1. ]]>MD5加密法http://www.tkk7.com/ioriqw/articles/46398.html崛v的程序员崛v的程序员Tue, 16 May 2006 06:29:00 GMThttp://www.tkk7.com/ioriqw/articles/46398.htmlhttp://www.tkk7.com/ioriqw/comments/46398.htmlhttp://www.tkk7.com/ioriqw/articles/46398.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/46398.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/46398.html 介绍MD5加密法基本情况MD5的全U是Message-Digest Algorithm 5Q在90q代初由MIT的计机U学实验室和RSA Data Security Inc发明Q经MD2、MD3和MD4发展而来?br />Message-Digest泛指字节?Message)的Hash变换Q就是把一个Q意长度的字节串变换成一定长的大整数。请注意我用了"字节?而不?字符?q个词,是因U变换只与字节的值有养I与字W集或编码方式无兟?

    MD5Q意长度的"字节?变换成一?28bit的大整数Qƈ且它是一个不可逆的字符串变换算法,换句话说是Q即使你看到源程序和法描述Q也无法一个MD5的值变换回原始的字W串Q从数学原理上说Q是因ؓ原始的字W串有无I多个,q有点象不存在反函数的数学函数?/font>

    MD5的典型应用是对一DMessage(字节?产生fingerprint(指纹)Q以防止?改"。D个例子,你将一D话写在一个叫readme.txt文g中,q对q个readme.txt产生一个MD5的值ƈ记录在案Q然后你可以传播q个文gl别人,别h如果修改了文件中的Q何内容,你对q个文g重新计算MD5时就会发现。如果再有一个第三方的认证机构,用MD5q可以防止文件作者的"抵赖"Q这是所谓的数字{֐应用?/font>

    MD5q广泛用于加密和解密技术上Q在很多操作pȝ中,用户的密码是以MD5|或类似的其它法Q的方式保存的,用户Login的时候,pȝ是把用户输入的密码计成MD5|然后再去和系l中保存的MD5D行比较,而系lƈ?知道"用户的密码是什么?/font>

    一些黑客破莯U密码的Ҏ是一U被UCؓ"跑字?的方法。有两种Ҏ得到字典Q一U是日常搜集的用做密码的字符串表Q另一U是用排列组合方法生成的Q先用MD5E序计算些字兔R的MD5|然后再用目标的MD5值在q个字典中检索?/font>

    即假设密码的最大长度ؓ8Q同时密码只能是字母和数字,?6+26+10=62个字W,排列l合出的字典的项数则是P(62,1)+P(62,2)....+P(62,8)Q那也已l是一个很天文的数字了Q存储这个字典就需要TBU的盘l,而且q种Ҏq有一个前提,是能获得目标̎L密码MD5值的情况下才可以?/font>

    在很多电子商务和C֌应用中,理用户的Account是一U最常用的基本功能,管很多Application Server提供了这些基本组Ӟ但很多应用开发者ؓ了管理的更大的灵zL还是喜Ƣ采用关pL据库来管理用P懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中Q因此这些用L密码对Y件开发者或pȝ理员来说可以说毫无保密可言Q本文的目的是介lMD5的Java Bean的实玎ͼ同时l出用MD5来处理用LAccount密码的例子,q种Ҏ使得理员和E序设计者都无法看到用户的密码,管他们可以初始化它们。但重要的一Ҏ对于用户密码讄习惯的保?/font>

    MD加密法的JAVA描述为:

    import java.security.*; 
    import java.security.spec.*; 

     

    class Md5{
    public final static String MD5(String s){ 
    char hexDigits[] = { 
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 
    try { 
    byte[] strTemp = s.getBytes(); 
    MessageDigest mdTemp = MessageDigest.getInstance("MD5"); 
    mdTemp.update(strTemp); 
    byte[] md = mdTemp.digest(); 
    int j = md.length; 
    char str[] = new char[j * 2]; 
    int k = 0; 
    for (int i = 0; i < j; i++) { 
    byte byte0 = md[i]; 
    str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
    str[k++] = hexDigits[byte0 & 0xf]; 

    return new String(str); 

    catch (Exception e){ 
    return null; 


    public static void main(String[] args){ 
    System.out.print(MD5.Md5("XX")); 
    }



    ]]>
    SWT-Designer4.2.0注册?/title><link>http://www.tkk7.com/ioriqw/articles/44079.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Sat, 29 Apr 2006 12:47:00 GMT</pubDate><guid>http://www.tkk7.com/ioriqw/articles/44079.html</guid><wfw:comment>http://www.tkk7.com/ioriqw/comments/44079.html</wfw:comment><comments>http://www.tkk7.com/ioriqw/articles/44079.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.tkk7.com/ioriqw/comments/commentRss/44079.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ioriqw/services/trackbacks/44079.html</trackback:ping><description><![CDATA[ <strong> <br /> </strong> <font face="Arial" size="2">注册? <br />SN:WindowBuilderPro-H5AB8-4J5D5-64P34<br />AK:WindowBuilderPro-1F3HF-FM0QY-74X53</font> <img src ="http://www.tkk7.com/ioriqw/aggbug/44079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-04-29 20:47 <a href="http://www.tkk7.com/ioriqw/articles/44079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无堵塞代理服务器-使用channle双通道技?/title><link>http://www.tkk7.com/ioriqw/articles/43743.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Fri, 28 Apr 2006 03:26:00 GMT</pubDate><guid>http://www.tkk7.com/ioriqw/articles/43743.html</guid><wfw:comment>http://www.tkk7.com/ioriqw/comments/43743.html</wfw:comment><comments>http://www.tkk7.com/ioriqw/articles/43743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ioriqw/comments/commentRss/43743.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ioriqw/services/trackbacks/43743.html</trackback:ping><description><![CDATA[ <p> <font face="Arial" color="#808080" size="2">public class ProxyServer<br />{</font> </p> <p> <font face="Arial" color="#808080" size="2">    private static final int PORT = 9999;</font> </p> <p> <font face="Arial" color="#808080" size="2">    private ByteBuffer buffer = ByteBuffer.allocate(10240);</font> </p> <p> <font face="Arial" color="#808080" size="2">    private ProxyUtil proxyUtil = new ProxyUtil();</font> </p> <p> <font face="Arial" color="#808080" size="2">    private static String remoteHost = "";</font> </p> <p> <font face="Arial" color="#808080" size="2">    private static int remotePort = 80;</font> </p> <p> <font face="Arial" color="#808080" size="2">    private Logger log = ZXLogger.getLogger(ProxyServer.class.getName());</font> </p> <p> <font face="Arial" color="#808080" size="2">    //private Log log = LogFactory.getLog(ProxyServer.class);</font> </p> <p> <font face="Arial" color="#808080" size="2">    public ProxyServer()<br />    {<br />        //PropertyConfigurator.configure("src/log4j.properties");<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    /**<br />     * Ҏ名称Qstart <p><br />     * Ҏ功能Q运行代理服务器 <p><br />     * 参数说明Q?lt;p><br />     * q回Qvoid <p><br />     * 作者:李明 <p><br />     * 日期Q?006q??3?<p><br />     */<br />    public void runServer()<br />    {</font> </p> <p> <font face="Arial" color="#808080" size="2">        ServerSocket sSocket = null;<br />        ServerSocketChannel ssc = null;</font> </p> <p> <font face="Arial" color="#808080" size="2">        // 代理服务器监听开?/font> </p> <p> <font face="Arial" color="#808080" size="2">        Selector selector = null;<br />        try<br />        {<br />            ssc = ServerSocketChannel.open();<br />            sSocket = ssc.socket();<br />            sSocket.bind(new InetSocketAddress(PORT));</font> </p> <p> <font face="Arial" color="#808080" size="2">            selector = Selector.open();</font> </p> <p> <font face="Arial" color="#808080" size="2">            System.err.println("Listening Port is " + PORT);</font> </p> <p> <font face="Arial" color="#808080" size="2">            ssc.configureBlocking(false);<br />            ssc.register(selector, SelectionKey.OP_ACCEPT);<br />        }<br />        catch(ClosedChannelException e1)<br />        {<br />            // TODO Auto-generated catch block<br />            e1.printStackTrace();<br />        }<br />        catch(IOException e1)<br />        {<br />            // TODO Auto-generated catch block<br />            e1.printStackTrace();<br />        }</font> </p> <p> <font face="Arial" color="#808080" size="2">        try<br />        {<br />            while(true)<br />            {</font> </p> <p> <font face="Arial" color="#808080" size="2">                int n = selector.select();</font> </p> <p> <font face="Arial" color="#808080" size="2">                if(n == 0)<br />                {<br />                    continue; // nothing to do<br />                }</font> </p> <p> <font face="Arial" color="#808080" size="2">                Set set = selector.selectedKeys();</font> </p> <p> <font face="Arial" color="#808080" size="2">                Iterator iter = set.iterator();</font> </p> <p> <font face="Arial" color="#808080" size="2">                while(iter.hasNext())<br />                {<br />                    SelectionKey key = (SelectionKey)iter.next();</font> </p> <p> <font face="Arial" color="#808080" size="2">                    if(key.isAcceptable())<br />                    {<br />                        ServerSocketChannel svrSocketChannel = (ServerSocketChannel)key.channel();<br />                        SocketChannel clientChannel = null;<br />                        try<br />                        {<br />                            clientChannel = svrSocketChannel.accept();<br />                        }<br />                        catch(IOException e)<br />                        {<br />                            // TODO Auto-generated catch block<br />                            if(clientChannel != null)<br />                            {</font> </p> <p> <font face="Arial" color="#808080" size="2">                                clientChannel.close();<br />                            }<br />                            if(key != null)<br />                            {<br />                                key.cancel();<br />                            }<br />                        }</font> </p> <p> <font face="Arial" color="#808080" size="2">                        send(clientChannel);</font> </p> <p> <font face="Arial" color="#808080" size="2">                    }<br />                    iter.remove();<br />                    log.info("************SEND  END*************");<br />                }<br />            }<br />        }<br />        catch(IOException e)<br />        {<br />            // TODO Auto-generated catch block<br />            log.info("ServerSocketChannelMq代发生核心异常\r\n" + e.getMessage());<br />            e.printStackTrace();<br />        }</font> </p> <p> <font face="Arial" color="#808080" size="2">    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    /**<br />     * Ҏ名称Qsend <p><br />     * Ҏ功能Q发送给客户信息 <p><br />     * 参数说明QSocketChannel, String <p><br />     * q回Qvoid <p><br />     * 作者:李明 <p><br />     * 日期Q?006q??3?<p><br />     *<br />     * @param channel<br />     * @param key<br />     * @throws IOException<br />     */<br />    public void send(SocketChannel clientChannel)<br />    {</font> </p> <p> <font face="Arial" color="#808080" size="2">        SocketChannel remoteSvrChannel = null;</font> </p> <p> <font face="Arial" color="#808080" size="2">        buffer.clear();<br />        int count;</font> </p> <p> <font face="Arial" color="#808080" size="2">        log.info("************SEND START*************");</font> </p> <p> <font face="Arial" color="#808080" size="2">        try<br />        {<br />            while((count = clientChannel.read(buffer)) > 0)<br />            {<br />                buffer.flip();</font> </p> <p> <font face="Arial" color="#808080" size="2">                byte[] bytebuffer = new byte[count];<br />                buffer.get(bytebuffer, 0, count);</font> </p> <p> <font face="Arial" color="#808080" size="2">                ByteBuffer bufferWrite = ByteBuffer.wrap(bytebuffer);</font> </p> <p> <font face="Arial" color="#808080" size="2">                byte[] b = new byte[bufferWrite.limit()];<br />                bufferWrite.get(b);<br />                String context = new String(b);</font> </p> <p> <font face="Arial" color="#808080" size="2">                // 打印客户h代理服务器信?br />                log.info(context);</font> </p> <p> <font face="Arial" color="#808080" size="2">                // 解析客户信息Q得到远E主机和端口?br />                proxyUtil.setUrl(context);<br />                setRemoteHost(proxyUtil.getHost());<br />                setRemotePort(proxyUtil.getPort());</font> </p> <p> <font face="Arial" color="#808080" size="2">                log.info("Remote Host " + getRemoteHost());<br />                log.info("Remote Port " + getRemotePort());</font> </p> <p> <font face="Arial" color="#808080" size="2">                if(remoteSvrChannel == null)<br />                {<br />                    InetSocketAddress inet = new InetSocketAddress(getRemoteHost(), getRemotePort());<br />                    try<br />                    {<br />                        remoteSvrChannel = SocketChannel.open(inet);<br />                        // remoteSvrChannel.configureBlocking(false);<br />                        // Socket remoteSvr = remoteSvrChannel.socket();<br />                        // remoteSvr.setSoTimeout(1000);<br />                        bufferWrite.flip();<br />                        remoteSvrChannel.write(bufferWrite);<br />                        buffer.clear();<br />                        int n;<br />                        while((n = remoteSvrChannel.read(buffer)) > 0)<br />                        {<br />                            log.info("n=" + n);<br />                            buffer.flip();<br />                            log.info("buffer.limit=" + buffer.limit());<br />                            clientChannel.write(buffer);<br />                        }<br />                    }<br />                    catch(java.nio.channels.UnresolvedAddressException ex)<br />                    {<br />                        log.info("L地址讉K无效\r\n" + ex.getMessage());<br />                    }<br />                    catch(IOException e)<br />                    {<br />                        // TODO Auto-generated catch block<br />                        try<br />                        {<br />                            if(remoteSvrChannel != null)<br />                            {<br />                                remoteSvrChannel.close();<br />                            }<br />                        }<br />                        catch(IOException e1)<br />                        {<br />                            // TODO Auto-generated catch block<br />                            e1.printStackTrace();<br />                        }<br />                    }<br />                }<br />            }<br />        }<br />        catch(IOException e1)<br />        {<br />            // TODO Auto-generated catch block<br />            try<br />            {<br />                if(clientChannel != null)<br />                {<br />                    clientChannel.close();<br />                }<br />            }<br />            catch(IOException e)<br />            {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }</font> </p> <p> <font face="Arial" color="#808080" size="2">        finally<br />        {<br />            try<br />            {<br />                if(remoteSvrChannel != null)<br />                {<br />                    remoteSvrChannel.close();<br />                }<br />                if(clientChannel != null)<br />                {<br />                    clientChannel.close();<br />                }<br />            }<br />            catch(IOException e)<br />            {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }</font> </p> <p> <font face="Arial" color="#808080" size="2">        // 打印q程服务器返回给客户端信?br />//        buffer.flip();<br />//        byte[] b2 = new byte[buffer.limit()];<br />//        buffer.get(b2);<br />//        log.info(new String(b2));</font> </p> <p> <font face="Arial" color="#808080" size="2">        // 关闭q程和客Lq接</font> </p> <p> <font face="Arial" color="#808080" size="2">    }</font> </p> <p> <br /> <font face="Arial" color="#808080" size="2">    public static String getRemoteHost()<br />    {<br />        return remoteHost;<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    public static void setRemoteHost(String remoteHost)<br />    {<br />        ProxyServer.remoteHost = remoteHost;<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    public static int getRemotePort()<br />    {<br />        return remotePort;<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    public static void setRemotePort(int remotePort)<br />    {<br />        ProxyServer.remotePort = remotePort;<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    public ByteBuffer getBuffer()<br />    {<br />        return buffer;<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    public void setBuffer(ByteBuffer buffer)<br />    {<br />        this.buffer = buffer;<br />    }</font> </p> <p> <font face="Arial" color="#808080" size="2">    /**<br />     * @param args<br />     */<br />    public static void main(String[] args)<br />    {<br />        // TODO Auto-generated method stub<br />        ProxyServer p = new ProxyServer();<br />        p.runServer();<br />    }<br />}</font> </p> <img src ="http://www.tkk7.com/ioriqw/aggbug/43743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-04-28 11:26 <a href="http://www.tkk7.com/ioriqw/articles/43743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堵塞代理服务?未用channelhttp://www.tkk7.com/ioriqw/articles/43742.html崛v的程序员崛v的程序员Fri, 28 Apr 2006 03:24:00 GMThttp://www.tkk7.com/ioriqw/articles/43742.htmlhttp://www.tkk7.com/ioriqw/comments/43742.htmlhttp://www.tkk7.com/ioriqw/articles/43742.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/43742.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/43742.html     /**
         * Ҏ名称QrunServer<p>
         * Ҏ功能Q运行代理服务器<p>
         * 参数说明Q?<p>
         * q回Qvoid <p>
         * 作者:李明
         * 日期Q?006q???br />     * @throws IOException
         */
        public void runServer() throws IOException
        {
            // 创徏代理服务器监?端口默认?999(可以通过属性文档修改其他端?
            ServerSocket ss = new ServerSocket(localport);
            final com.zte.ums.zxnm01.cpe.common.http.ProxyUtil proxyUtil = new com.zte.ums.zxnm01.cpe.common.http.ProxyUtil();
            final byte[] request = new byte[1024];
            byte[] reply = new byte[4096];

            while(true)
            {
                Socket client = null, server = null;
                try
                {
                    // {待客户q接
                    client = ss.accept();
                    log.info("*******Client logon*******");
                    log.info(client);
                    final InputStream streamFromClient = client.getInputStream();
                    final OutputStream streamToClient = client.getOutputStream();

                    // q接真实的服务器,如果不能q接成功,向客户发送错误信?断开本次q接
                    // q且l箋{待q接.
                    try
                    {
                        server = new Socket(host, remoteport);
                    }
                    catch(IOException e)
                    {
                        PrintWriter out = new PrintWriter(streamToClient);
                        out.print("Proxy server cannot connect to " + host + ":" + remoteport + ":\n" + e + "\n");
                        out.flush();
                        client.close();
                        continue;
                    }

                    // 得到q接服务器的输入输出?
                    final InputStream streamFromServer = server.getInputStream();
                    final OutputStream streamToServer = server.getOutputStream();

                    // 构徏一个单独线E读客户hq传l服务器,此线Eؓ异步.
                    Thread t = new Thread()
                    {
                        public void run()
                        {
                            int bytesRead;
                            String context = null;
                            try
                            {
                                while((bytesRead = streamFromClient.read(request)) != -1)
                                {
                                    streamToServer.write(request, 0, bytesRead);
                                    context = new String(request).trim();
                                    streamToServer.flush();
                                }
                                // 打印客户览器发来的信息
                                log.info("#################S##############");
                                log.info(context);
                                log.info("#################E##############");
                                // 解析发来的信?获取h的主机地址和端?
                                proxyUtil.setUrl(context);
                                host = proxyUtil.getHost();
                                remoteport = proxyUtil.getPort();
                                log.info("host : '" + host + "'" + " port : '" + remoteport + "'");

                            }
                            catch(IOException e)
                            {
                                // e.printStackTrace();
                            }

                            // 关闭h服务器连?屏蔽无意义的异常,减少代理服务器负?
                            try
                            {
                                streamToServer.close();
                            }
                            catch(IOException e)
                            {
                                // e.printStackTrace();
                            }
                        }
                    };

                    // 开启客L到服务器hU程
                    t.start();

                    // L务器的请?成功后返回信息给客户?
                    int bytesRead;
                    try
                    {
                        while((bytesRead = streamFromServer.read(reply)) != -1)
                        {
                            streamToClient.write(reply, 0, bytesRead);
                            streamToClient.flush();
                        }
                    }
                    catch(IOException e)
                    {
                        // e.printStackTrace();
                    }

                    // 关闭客户q接.
                    streamToClient.close();
                }
                catch(IOException e)
                {
                    System.err.println(e);
                }
                finally
                {
                    try
                    {
                        if(server != null)
                        {
                            server.close();
                        }
                        if(client != null)
                        {
                            client.close();
                        }
                    }
                    catch(IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        }



    ]]>
    SWT技巧荟?-讄居中http://www.tkk7.com/ioriqw/articles/43739.html崛v的程序员崛v的程序员Fri, 28 Apr 2006 03:21:00 GMThttp://www.tkk7.com/ioriqw/articles/43739.htmlhttp://www.tkk7.com/ioriqw/comments/43739.htmlhttp://www.tkk7.com/ioriqw/articles/43739.html#Feedback1http://www.tkk7.com/ioriqw/comments/commentRss/43739.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/43739.html    /**
         * Ҏ名称QsetShell<p>
         * Ҏ功能Q设|浏览器昄居中和浏览器的大?默认?00*600<p>
         * 参数说明QShell<p>
         * q回Q?lt;p>
         * 作者:李明
         * 日期Q?006q??0?br />     */
        public void setShell(Shell shell)
        {
            shell.setSize(800, 600);
            int width = shell.getMonitor().getClientArea().width;
            int height = shell.getMonitor().getClientArea().height;
            int x = shell.getSize().x;
            int y = shell.getSize().y;
            if(x > width)
            {
                shell.getSize().x = width;
            }
            if(y > height)
            {
                shell.getSize().y = height;
            }
            shell.setLocation((width - x) / 2, (height - y) / 2);
        }


    ]]>自动dh面http://www.tkk7.com/ioriqw/articles/43738.html崛v的程序员崛v的程序员Fri, 28 Apr 2006 03:19:00 GMThttp://www.tkk7.com/ioriqw/articles/43738.htmlhttp://www.tkk7.com/ioriqw/comments/43738.htmlhttp://www.tkk7.com/ioriqw/articles/43738.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/43738.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/43738.html     /**
         * Ҏ名称QgetPostPage<p>
         * Ҏ功能Q自动登录请求页?lt;p>
         * 参数说明Q登陆主机的ip地址, 端口?lt;p>
         * q回Q?lt;p>
         * 作者:李明
         * 日期Q?006q??3?br />     */
        public void getPostPage(String host, int port)
        {
            HttpClient httpClient = new HttpClient();
            httpClient.getHostConfiguration().setHost(host, port);
            // 创徏POSTҎ的实?br />        PostMethod postMethod = new PostMethod(url);
            // 使用pȝ提供的默认的恢复{略
            postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            // 填入各个表单域的?br />        NameValuePair[] data =
                {new NameValuePair("tUsername", "admin"), new NameValuePair("tPassword", "admin")};
            // 表单的值放入postMethod?br />        postMethod.setRequestBody(data);
            try
            {
                // 执行postMethod
                int statusCode = httpClient.executeMethod(postMethod);
                System.out.println("statusCode " + statusCode);
                // HttpClient对于要求接受后服务的请求,象POST和PUT{不能自动处理{?br />            // 301或?02
                if(statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY)
                {
                    // 从头中取{向的地址
                    Header locationHeader = postMethod.getResponseHeader("location");
                    String location = null;
                    if(locationHeader != null)
                    {
                        location = locationHeader.getValue();
                        System.out.println("The page was redirected to:" + location);
                    }
                    else
                    {
                        System.err.println("Location field value is null.");
                    }
                    return;
                }
                if(statusCode != HttpStatus.SC_OK)
                {
                    System.err.println("Method failed: " + postMethod.getStatusLine());
                }
                System.out.println(statusCode);
                /*
                 * //如果所h的页面已讑֮cookie那么无需q回内容Q可直接使用url讉K登陆成功面?br />             * // d内容
                 *  byte[] responseBody = postMethod.getResponseBody();
                 * // 处理内容
                 *  System.out.println(new String(responseBody));
                 */
            }
            catch(HttpException e)
            {
                // 发生致命的异常,可能是协议不Ҏ者返回的内容有问?br />            System.out.println("Please check your provided http address!");
                e.printStackTrace();
            }
            catch(IOException e)
            {
                // 发生|络异常
                e.printStackTrace();
            }
            finally
            {
                // 释放q接
                postMethod.releaseConnection();
            }
        }

        /**
         * Ҏ名称QgetPostPage163<p>
         * Ҏ功能Q返?63信箱自动登陆面<p>
         * 参数说明Q?63邮箱用户名和密码<p>
         * q回QString 登陆成功后的面<p>
         * 作者:李明
         * 日期Q?006q??3?br />     */
        public static String getPostPage163(String userid, String passid)
        {
            HttpClient httpClient = new HttpClient();
            httpClient.getHostConfiguration().setProxy("proxynj.zte.com.cn", 80);
            String url = "        String buff = null;
            // 创徏POSTҎ的实?br />        PostMethod postMethod = new PostMethod(url);
            // 使用pȝ提供的默认的恢复{略
            postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
            // 填入各个表单域的?br />        NameValuePair[] data =
                {new NameValuePair("username", userid), new NameValuePair("password", passid)};
            // 表单的值放入postMethod?br />        postMethod.setRequestBody(data);
            try
            {
                // 执行postMethod
                int statusCode = httpClient.executeMethod(postMethod);
                // HttpClient对于要求接受后服务的请求,象POST和PUT{不能自动处理{?br />            // 301或?02
                if(statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY)
                {
                    // 从头中取{向的地址
                    Header locationHeader = postMethod.getResponseHeader("location");
                    String location = null;
                    if(locationHeader != null)
                    {
                        location = locationHeader.getValue();
                        System.out.println("The page was redirected to:" + location);
                    }
                    else
                    {
                        System.err.println("Location field value is null.");
                    }
                    return null;
                }
                if(statusCode != HttpStatus.SC_OK)
                {
                    System.err.println("Method failed: " + postMethod.getStatusLine());
                }
                // d内容
                byte[] responseBody = postMethod.getResponseBody();
                // 处理内容
                System.out.println(new String(responseBody));
                String redirect = new String(responseBody);

                System.out.println(redirect.lastIndexOf("></HEAD>"));
                System.out.println(redirect.substring(redirect.indexOf("URL") + 4, redirect.lastIndexOf("></HEAD>") - 1));
                redirect = redirect.substring(redirect.indexOf("URL") + 4, redirect.lastIndexOf("></HEAD>") - 1);
                GetMethod getMethod = new GetMethod("
                httpClient.executeMethod(getMethod);
                buff = getMethod.getResponseBodyAsString();
            }
            catch(HttpException e)
            {
                // 发生致命的异常,可能是协议不Ҏ者返回的内容有问?br />            System.out.println("Please check your provided http address!");
                e.printStackTrace();
            }
            catch(IOException e)
            {
                // 发生|络异常
                e.printStackTrace();
            }
            finally
            {
                // 释放q接
                postMethod.releaseConnection();
            }
            return buff;

        }



    ]]>
    hibernate应用配置说明-middlegen和hbm2java的配|?http://www.tkk7.com/ioriqw/articles/43491.html崛v的程序员崛v的程序员Thu, 27 Apr 2006 02:27:00 GMThttp://www.tkk7.com/ioriqw/articles/43491.htmlhttp://www.tkk7.com/ioriqw/comments/43491.htmlhttp://www.tkk7.com/ioriqw/articles/43491.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/43491.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/43491.html  hibernate应用配置说明-middlegen和hbm2java的配|?/font>
    --  hibernate应用配置说明 -- Middlegen
    ************************************
    ant配置
    ************************************
    下蝲antQ解?br />ant考到c:跟目?br />环境变量里加上ANT_HOME=c:\\ant
    PATH=c:\\ant\\bin;
    q入命o行模式,输入Q?ant
    如:
    C:\\>ant
    Buildfile: build.xml does not exist!
    Build failed
    出现该显C,说明ant已配|成?br />
    ************************************
    Middlegen hibernate配置
    ************************************
    是hibernate的O/R Mapping工具
    http://hibernate.bluemars.net/98.html
    可以生成*.hbm.xml文gQ是hibernate所需的映文?br />下蝲Middlegen HibernateQ解压,如D:\\hiber\\Middlegen-Hibernate-r1\\
    q入目录Q?br />【配|数据库Q以MS SQLSERVERZQJDBC驱动为JSQL ConnectQwww.j-netdirect.comQ?br />1、进?config/database/目录
    2、将JSQLConnect.jar驱动考到/lib/目录
    3、编辑mssql.xml文gQ如?br /><property name="database.script.file" value=""/>
    <property name="database.driver.file" value="${lib.dir}/JSQLConnect.jar"/>
    <property name="database.driver" value="com.jnetdirect.jsql.JSQLDriver"/>
    <property name="database.url" value="jdbc:JSQLConnect://数据库服务器名或IP/database=要操作的数据库名"/>
    <property name="database.userid" value="数据库用户名"/>
    <property name="database.password" value="数据库密?/>
    <property name="database.schema" value=""/>
    <property name="database.catalog" value=""/>
    <property name="jboss.datasource.mapping" value="MS SQLSERVER2000"/>

    【编辑Middlegen hibernate配置?br />1、编辑build.xml
    2、修Ҏ据库默认文gQ找到这行,大概?2行左?br /><!DOCTYPE project [
    <!--ENTITY database SYSTEM "file:./config/database/hsqldb.xml"-->//原内容,注解?br /><!ENTITY database SYSTEM "file:./config/database/mssql.xml">//加上
    ]>

    3、编辑输出的根目录名Q找到该行,大概?0行左?br /><!--property name="name" value="airline"/-->//原内容,注解?br /><property name="name" value="com"/>//加上,valueZ惌的,如com

    4、编辑输出的包名Q找到该行,大概?10行左?br /><!--hibernate
    destination="${build.gen-src.dir}"
    package="${name}.hibernate"
    /-->//原内容,注解?br /><hibernate
    destination="${build.gen-src.dir}"
    package="${name}.test"
    />//加上Q生成的xml文g里,会以com.test作ؓ你的package
    输出目录?build/gen-src/com/test/*.hbm.xmlQ?为对应的表,命名Z自己所定义的名Uͼ

    5、定义输出的目录Q找到该行,在文档最?br /><target name="validate">
    <xmlvalidate failonerror="no" lenient="no" warn="yes">
       <fileset dir="${build.gen-src.dir}/com/test" includes="*.xml" />Ҏ你要输出的目录结构,最好以你的包的l构作ؓ目录l构
    </xmlvalidate>
    </target>

    6、在q接Sql serverӞ提示数据库连接成功,但说没有表,扑ֈ该行
    <middlegen
    appname="${name}"
    prefsdir="${src.dir}"
    gui="${gui}"
    databaseurl="${database.url}"
    initialContextFactory="${java.naming.factory.initial}"
    providerURL="${java.naming.provider.url}"
    datasourceJNDIName="${datasource.jndi.name}"
    driver="${database.driver}"
    username="${database.userid}"
    password="${database.password}"

    schema="${database.schema}"http://L
    catalog="${database.catalog}" //LQ这样就可以?br />>

    【配|完毕?br />配置完毕后,在根目录下运行ant
    则会出现一个可视化的操作界面,如图
    默认会根据表名和字段名对应生成相应的名称Q当然你也可以自己定义,对应没问题,则可以点凅RGenerate】,在可发现
    /build/gen-src/com/test/*.hbm.xmlQ会生成相应XML文g

    ************************************
    hibernate-extensions-2.0应用配置
    ************************************
    q是hibernate的工?/tools下有3个工?br />class2hbm.bat Ҏ你自己对应表所写的java文gQ生成相应的*.hbm.xml文g
    ddl2hbm.bat Ҏ你的数据库表Q自动生?.hbm.xml?.java文gQ如果不需要详l的配置Q徏议用q种方式生成*.xml?.java文gQ?br />hbm2java.bat Ҏ*.hbm.xml生成相应?.java文g

    用之前,首先得用ant~译
    【注意的地方?br />build.xml
    <property name="hibernate-core.home" value="../../hibernate-2.0"/>//扑ֈ该行Q?0行左?br />valueZ得hibernate解压目录

    【编译完毕?br />~译完的文g存放?tools/target/hibernate-tools-2.0/
    现在可以用编译完的执行文件进行映{化了

    【应用?br />hbm2java.bat
    1、进入命令行模式Q进入hibernate-tools-2.0目录Q进?bin
    2、首先执行setenv.batQ设|一下环境变量,q行前,先检查一下setenv.bat文gQ用文本~辑器打开Q找到如下行Q?br />set JDBC_DRIVER=C:\\Progra~1\\SQLLIB\\java\\db2java.zip;C:\\mm.mysql-2.0.14\\mm.mysql-2.0.14-bin.jar;D:\\j2sdk1.4.1\\lib\\JSQLConnect.jar
    //你的JDBC驱动dq去
    rem set HIBERNATE_HOME=..\\..\\hibernate-2.0//原来?br />set HIBERNATE_HOME=D:\\hiber\\hibernate-2.0//Ҏ你当前hibernate-2.0所在目?br />3、执行hbm2java.bat D:\\hiber\\com\\test\\*.xml //后面所跟的是你用Middlegen Hibernate所生成?.hbm.xml文g

    ddl2hbm.bat
    1?步骤如hbm2java
    3、运行ddl2hbmQ会弹开一个图形界?br />4、在Connection面板里,输入JDBC驱动的相关信息,如:
    DriverClassQcom.jnetdirect.jsql.JSQLDriver
    ConnectionUrlQjdbc:JSQLConnect://服务器名/database=数据库名&user=用户?amp;password=密码Q注意这是我所用的驱动支持用户名和密码放在后面这U格式)
    UserNameQ用户名Q我的ConnectionUrl已填写该信息Q这里可不填Q?br />PassWordQ密码(我的ConnectionUrl已填写该信息Q这里可不填Q?br />5、在Code面板里,可以定义包名
    6、在Output面板里,可以定义文g输出路径
    7、设|好后,q入Table面板Q点击tables…按钮,如果数据库连接成功,则会弹开一个小面板Q选择你要映射的数据库Q点ȝ定即可,此时
    Table面板里就会显C数据库的所有表|选择你需要的表,点击“Generate”,则在输出路径里生?.hbm.xml?.java文g

    【注意的地方?br />因ؓSqlserver不支持hibernate里的sequencescdQ在试代码时会出错Q你打开生成?.hbm.xml
    ?br /><id column="test_id" name="id" type="java.lang.Long">
    <generator class="identity"/>//q里Ҏidentity卛_
    </id>

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=678615



    ]]>Java的内存泄?/title><link>http://www.tkk7.com/ioriqw/articles/43485.html</link><dc:creator>崛v的程序员</dc:creator><author>崛v的程序员</author><pubDate>Thu, 27 Apr 2006 02:16:00 GMT</pubDate><guid>http://www.tkk7.com/ioriqw/articles/43485.html</guid><wfw:comment>http://www.tkk7.com/ioriqw/comments/43485.html</wfw:comment><comments>http://www.tkk7.com/ioriqw/articles/43485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/ioriqw/comments/commentRss/43485.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/ioriqw/services/trackbacks/43485.html</trackback:ping><description><![CDATA[ <div background-color:#c0c0c0=""> <a > <font size="2"> <font face="Arial"> <img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> Java的内存泄?/font> </font> </a> <script language="javascript"><![CDATA[ocument.title="Java的内存泄?- "+document.title]]></script> <font face="Arial"> </font> </div> <div id="355zvl5" class="postText"> <font face="Arial" size="2">Qibm:developerworks中国|站 Ƨ阳辰周ƣ?br />一 问题的提?br /><br />Java的一个重要优点就是通过垃圾攉?Garbage CollectionQGC)自动理内存的回ӞE序员不需要通过调用函数来释攑ֆ存。因此,很多E序员认为Java不存在内存泄漏问题,或者认为即使有内存泄漏也不是程序的责QQ而是GC或JVM的问题。其实,q种x是不正确的,因ؓJava也存在内存泄Ԍ但它的表CC++不同?br /><br />随着来多的服务器E序采用Java技术,例如JSPQServletQ EJB{,服务器程序往往长期q行。另外,在很多嵌入式pȝ中,内存的总量非常有限。内存泄露问题也变得十分关键,即每次q行量泄漏Q长期运行之后,pȝ也是面崩溃的危险?br /><br />二 Java是如何管理内?br /><br />Z判断Java中是否有内存泄露Q我们首先必M解Java是如何管理内存的。Java的内存管理就是对象的分配和释N题。在Java中,E序员需要通过关键字new为每个对象申请内存空闾b?基本cd除外)Q所有的对象都在堆?Heap)中分配空间。另外,对象的释放是由GC军_和执行的。在Java中,内存的分配是q序完成的Q而内存的释放是有GC完成的,q种收支两条U的Ҏ实化了E序员的工作。但同时Q它也加重了JVM的工作。这也是JavaE序q行速度较慢的原因之一。因为,GCZ能够正确释放对象QGC必须监控每一个对象的q行状态,包括对象的申诗引用、被引用、赋值等QGC都需要进行监控?br /><br />监视对象状态是Z更加准确地、及时地释放对象Q而释攑֯象的Ҏ原则是该对象不再被引用?br /><br />Z更好理解GC的工作原理,我们可以对象考虑为有向图的顶点,引用关p考虑为图的有向边Q有向边从引用者指向被引对象。另外,每个U程对象可以作ؓ一个图的v始顶点,例如大多E序从mainq程开始执行,那么该图是以mainq程点开始的一|树。在q个有向图中Q根点可达的对象都是有效对象,GC不回收q些对象。如果某个对象?q通子?与这个根点不可?注意Q该图ؓ有向?Q那么我们认?q些)对象不再被引用,可以被GC回收?br /><br />以下Q我们D一个例子说明如何用有向图表C内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情c以下右图,是左边E序q行到第6行的C意图?br /><br /><br />Java使用有向囄方式q行内存理Q可以消除引用@环的问题Q例如有三个对象Q相互引用,只要它们和根q程不可辄Q那么GC也是可以回收它们的。这U方式的优点是管理内存的_ֺ很高Q但是效率较低。另外一U常用的内存理技术是使用计数器,例如COM模型采用计数器方式管理构Ӟ它与有向囄比,_ֺ行低(很难处理循环引用的问?Q但执行效率很高?br /><br />三 什么是Java中的内存泄露<br /><br />下面Q我们就可以描述什么是内存泄漏。在Java中,内存泄漏是存在一些被分配的对象,q些对象有下面两个特点,首先Q这些对象是可达的,卛_有向图中Q存在通\可以与其相连Q其ơ,q些对象是无用的Q即E序以后不会再用这些对象。如果对象满两个条gQ这些对象就可以判定为Java中的内存泄漏Q这些对象不会被GC所回收Q然而它却占用内存?br /><br />在C++中,内存泄漏的范围更大一些。有些对象被分配了内存空_然后却不可达Q由于C++中没有GCQ这些内存将永远收不回来。在Java中,q些不可辄对象都由GC负责回收Q因此程序员不需要考虑q部分的内存泄露?br /><br />通过分析Q我们得知,对于C++Q程序员需要自q理边和顶点,而对于JavaE序员只需要管理边可以了(不需要管理顶点的释放)。通过q种方式QJava提高了编E的效率?br /><br />因此Q通过以上分析Q我们知道在Java中也有内存泄漏,但范围比C++要小一些。因为Java从语a上保证,M对象都是可达的,所有的不可辑֯象都由GC理?br /><br />对于E序员来_GC基本是透明的,不可见的。虽Ӟ我们只有几个函数可以讉KGCQ例如运行GC的函数System.gc()Q但是根据Java语言规范定义Q 该函数不保证JVM的垃圾收集器一定会执行。因为,不同的JVM实现者可能用不同的法理GC。通常QGC的线E的优先U别较低。JVM调用GC的策略也有很多种Q有的是内存使用到达一定程度时QGC才开始工作,也有定时执行的,有的是^~执行GCQ有的是中断式执行GC。但通常来说Q我们不需要关心这些。除非在一些特定的场合QGC的执行媄响应用程序的性能Q例如对于基于Web的实时系l,如网l游戏等Q用户不希望GCH然中断应用E序执行而进行垃圑֛Ӟ那么我们需要调整GC的参敎ͼ让GC能够通过q缓的方式释攑ֆ存,例如垃圑֛收分解ؓ一pd的小步骤执行QSun提供的HotSpot JVM支持这一Ҏ?br /><br />下面l出了一个简单的内存泄露的例子。在q个例子中,我们循环甌Object对象Qƈ所甌的对象放入一个Vector中,如果我们仅仅释放引用本nQ那么Vector仍然引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,q必MVector中删除,最单的Ҏ是Vector对象讄为null?br /><br />Vector v=new Vector(10);<br />for (int i=1;i<100; i++)<br />{<br />Object o=new Object();<br />v.add(o);<br />o=null;<br />}<br />//此时Q所有的Object对象都没有被释放Q因为变量v引用q些对象?br /><br />四 如何检内存泄?br /><br />最后一个重要的问题Q就是如何检Java的内存泄漏。目前,我们通常使用一些工h查JavaE序的内存泄漏问题。市Z已有几种专业查Java内存泄漏的工P它们的基本工作原理大同小异,都是通过监测JavaE序q行Ӟ所有对象的甌、释攄动作Q将内存理的所有信息进行统计、分析、可视化。开发h员将Ҏq些信息判断E序是否有内存泄漏问题。这些工具包括Optimizeit ProfilerQJProbe ProfilerQJinSight , Rational 公司的Purify{?br /><br />下面Q我们将单介lOptimizeit的基本功能和工作原理?br /><br />Optimizeit Profiler版本4.11支持ApplicationQAppletQServlet和Romote Application四类应用Qƈ且可以支持大多数cd的JVMQ包括SUN JDKpdQIBM的JDKpdQ和Jbuilder的JVM{。ƈ且,该Y件是由Java~写Q因此它支持多种操作pȝ。Optimizeitpdq包括Thread Debugger和Code Coverage两个工具Q分别用于监运行时的线E状态和代码覆盖面?br /><br />当设|好所有的参数了,我们可以在OptimizeIt环境下运行被程序,在程序运行过E中QOptimizeit可以监视内存的用曲U?如下?Q包括JVM甌的堆(heap)的大,和实际用的内存大小。另外,在运行过E中Q我们可以随时暂停程序的q行Q甚臛_行调用GCQ让GCq行内存回收。通过内存使用曲线Q我们可以整体了解程序用内存的情况。这U监对于长期运行的应用E序非常有必要,也很Ҏ发现内存泄露?br /><br /><br />在运行过E中Q我们还可以从不同视角观查内存的使用情况QOptimizeit提供了四U方式:<br /><br />堆视角。 这是一个全面的视角Q我们可以了解堆中的所有的对象信息(数量和种c?Qƈq行l计、排序,qo。了解相兛_象的变化情况。?br />Ҏ视角。通过Ҏ视角Q我们可以得知每一U类的对象,都分配在哪些Ҏ中,以及它们的数量。?br />对象视角。给定一个对象,通过对象视角Q我们可以显C它的所有出引用和入引用对象Q我们可以了解这个对象的所有引用关pR?br />引用图。 给定一个根Q通过引用图,我们可以昄从该点出发的所有出引用。?br /><br />在运行过E中Q我们可以随时观察内存的使用情况Q通过q种方式Q我们可以很快找到那些长期不被释放,q且不再使用的对象。我们通过查这些对象的生存周期Q确认其是否为内存泄霌Ӏ在实践当中Q寻扑ֆ存泄露是一仉帔R烦的事情Q它需要程序员Ҏ个程序的代码比较清楚Qƈ且需要丰富的调试l验Q但是这个过E对于很多关键的JavaE序都是十分重要的?br /><br />lg所qͼJava也存在内存泄露问题,其原因主要是一些对象虽然不再被使用Q但它们仍然被引用。ؓ了解册些问题,我们可以通过软g工具来检查内存泄Ԍ查的主要原理是暴露出所有堆中的对象Q让E序员寻N些无用但仍被引用的对象?br /><br />相关资源:<br /><br />文章:<br />Jim Patrick, Handling memory leaks in Java programs,<br /></font> <a > <font size="2"> <font face="Arial">http://www-106.ibm.com/developerWorks/library/j-leaks/index.html</font> </font> </a> <br /> <font face="Arial" size="2">Ed Lycklama, Does Java Technology Have Memory Leaks?<br /></font> <a > <font size="2"> <font face="Arial">http://www.klgroup.com/javaone</font> </font> </a> <br /> <font size="2"> <font face="Arial">Sun, The Java HotSpot Virtual Machine, Technical White Paper<br /><br />软gQ?br />Sitraka Software's Jprobe </font> </font> <a > <font size="2"> <font face="Arial">http://www.sitraka.com</font> </font> </a> <br /> <font size="2"> <font face="Arial">Boland Software's Optimizeit </font> </font> <a href="http://optimizeit/"> <font size="2"> <font face="Arial">http://optimizeit</font> </font> </a> <br /> <font size="2"> <font face="Arial">IBM alphaWorks' Jinsight </font> </font> <a > <font size="2"> <font face="Arial">http://www.alphaworks.ibm.com/tech/jinsight</font> </font> </a> <br /> <br /> <font face="Arial" size="2">关于作者?br />Ƨ阳辎ͼ北京大学计算机硕士毕业,98qv开始研I基于java的Y件开发、测试,参与开发、测试过多个ZJava的应用程序和Web服务目。联pL式yeekee@sina.com<br />周欣Q北京大学计机pdd士生Q主要研I方向:E序理解、逆向工程及Y件度量,联系方式 zhouxin@sei.pku.edu.cn <br /><br /></font> <p id="TBPingURL"> <font size="2"> <font face="Arial">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=678260</font> </font> </p> </div> <img src ="http://www.tkk7.com/ioriqw/aggbug/43485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/ioriqw/" target="_blank">崛v的程序员</a> 2006-04-27 10:16 <a href="http://www.tkk7.com/ioriqw/articles/43485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TextMDBBeanhttp://www.tkk7.com/ioriqw/articles/42880.html崛v的程序员崛v的程序员Mon, 24 Apr 2006 11:17:00 GMThttp://www.tkk7.com/ioriqw/articles/42880.htmlhttp://www.tkk7.com/ioriqw/comments/42880.htmlhttp://www.tkk7.com/ioriqw/articles/42880.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/42880.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/42880.htmlpackage com.zte.mbean;

    import javax.ejb.MessageDrivenBean;
    import javax.ejb.MessageDrivenContext;
    import javax.ejb.EJBException;
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.TextMessage;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    public class TextMDBBean
        implements MessageDrivenBean, MessageListener {
      private MessageDrivenContext ctx = null;
      private QueueConnection conn;
      private QueueSession session;

      public TextMDBBean() {
        System.out.println("TextMDB.ctor, this=" + hashCode());
      }

      public void setMessageDrivenContext(MessageDrivenContext ctx) {
        this.ctx = ctx;
        System.out.println("TextMDB.setMessageDrivenContext, this=" +
                           hashCode());
      }

      public void ejbCreate() {
        System.out.println("TextMDB.ejbCreate, this=" + hashCode());
        try {
          setupPTP();
        }
        catch (Exception e) {
          throw new EJBException("Failed to init TextMDB", e);
        }
      }

      public void ejbRemove() {
        System.out.println("TextMDB.ejbRemove, this=" + hashCode());
        ctx = null;
        try {
          if (session != null) {
            session.close();
          }
          if (conn != null) {
            conn.close();
          }
        }
        catch (JMSException e) {
          e.printStackTrace();
        }
      }

      public void onMessage(Message msg) {
        System.out.println("TextMDB.onMessage, this=" + hashCode());
        try {
          TextMessage tm = (TextMessage) msg;
          String text = tm.getText() + "processed by: " + hashCode();
          Queue dest = (Queue) msg.getJMSReplyTo();
          sendReply(text, dest);
        }
        catch (Throwable t) {
          t.printStackTrace();
        }
      }

      private void setupPTP() throws JMSException, NamingException {
        InitialContext iniCtx = new InitialContext();
        Object tmp = iniCtx.lookup("java:comp/env/jms/QCF");
        QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;
        conn = qcf.createQueueConnection();
        session = conn.createQueueSession(false,
                                          QueueSession.AUTO_ACKNOWLEDGE);
        conn.start();
      }

      private void sendReply(String text, Queue dest) throws JMSException {
        System.out.println("TextMDB.sendReply, this=" +
                           hashCode() + ", dest=" + dest);
        QueueSender sender = session.createSender(dest);
        TextMessage tm = session.createTextMessage(text);
        sender.send(tm);
        sender.close();
      }

    }



    ]]>
    ejb-jar.xmlhttp://www.tkk7.com/ioriqw/articles/42881.html崛v的程序员崛v的程序员Mon, 24 Apr 2006 11:17:00 GMThttp://www.tkk7.com/ioriqw/articles/42881.htmlhttp://www.tkk7.com/ioriqw/comments/42881.htmlhttp://www.tkk7.com/ioriqw/articles/42881.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/42881.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/42881.html<?xml version="1.0" encoding="UTF-8"?>
    <ejb-jar xmlns="http://java.sun.com/xml/ns/j2ee  <display-name>TextMDB</display-name>
      <enterprise-beans>
        <message-driven>
          <ejb-name>TextMDB</ejb-name>
          <ejb-class>com.zte.mbean.TextMDBBean</ejb-class>
          <messaging-type>javax.jms.MessageListener</messaging-type>
          <transaction-type>Container</transaction-type>
          <message-destination-type>javax.jms.Queue</message-destination-type>
          <activation-config>
            <activation-config-property>
              <activation-config-property-name>destinationType</activation-config-property-name>
              <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
            </activation-config-property>
          </activation-config>
          <resource-ref>
            <res-ref-name>jms/QCF</res-ref-name>
            <res-type>javax.jms.QueueConnectionFactory</res-type>
            <res-auth>Container</res-auth>
          </resource-ref>
        </message-driven>
      </enterprise-beans>
      <assembly-descriptor>
        <container-transaction>
          <method>
            <ejb-name>TextMDB</ejb-name>
            <method-name>*</method-name>
          </method>
          <trans-attribute>Required</trans-attribute>
        </container-transaction>
      </assembly-descriptor>
    </ejb-jar>

     



    ]]>
    jboss.xmlhttp://www.tkk7.com/ioriqw/articles/42882.html崛v的程序员崛v的程序员Mon, 24 Apr 2006 11:17:00 GMThttp://www.tkk7.com/ioriqw/articles/42882.htmlhttp://www.tkk7.com/ioriqw/comments/42882.htmlhttp://www.tkk7.com/ioriqw/articles/42882.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/42882.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/42882.html<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "

    <jboss>
      <enterprise-beans>
        <message-driven>
          <ejb-name>TextMDB</ejb-name>
          <destination-jndi-name>queue/B</destination-jndi-name>
          <resource-ref>
            <res-ref-name>jms/QCF</res-ref-name>
            <jndi-name>ConnectionFactory</jndi-name>
          </resource-ref>
        </message-driven>
      </enterprise-beans>
    </jboss>

     



    ]]>
    SendRecvClient http://www.tkk7.com/ioriqw/articles/42879.html崛v的程序员崛v的程序员Mon, 24 Apr 2006 11:16:00 GMThttp://www.tkk7.com/ioriqw/articles/42879.htmlhttp://www.tkk7.com/ioriqw/comments/42879.htmlhttp://www.tkk7.com/ioriqw/articles/42879.html#Feedback0http://www.tkk7.com/ioriqw/comments/commentRss/42879.htmlhttp://www.tkk7.com/ioriqw/services/trackbacks/42879.htmlpackage com.zte.jms;

    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.Queue;
    import javax.jms.QueueConnection;
    import javax.jms.QueueConnectionFactory;
    import javax.jms.QueueReceiver;
    import javax.jms.QueueSender;
    import javax.jms.QueueSession;
    import javax.jms.TextMessage;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;

    import EDU.oswego.cs.dl.util.concurrent.CountDown;

    /**
     * A complete JMS client example program that sends N TextMessages to a Queue B
     * and asynchronously receives the messages as modified by TextMDB from Queue A.
     *
     * @author Scott.Stark@jboss.org
     * @version $Revision: 1.9 $
     */
    public class SendRecvClient {
     static final int N = 10;

     static CountDown done = new CountDown(N);

     QueueConnection conn;

     QueueSession session;

     Queue queA;

     Queue queB;

     public static class ExListener implements MessageListener {
      public void onMessage(Message msg) {
       done.release();
       TextMessage tm = (TextMessage) msg;
       try {
        System.out.println("onMessage, recv text=" + tm.getText());
       } catch (Throwable t) {
        t.printStackTrace();
       }
      }
     }

     public void setupPTP() throws JMSException, NamingException {
      InitialContext iniCtx = InitContext.getInitContext();
      Object tmp = iniCtx.lookup("ConnectionFactory");
      QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;
      conn = qcf.createQueueConnection();
      queA = (Queue) iniCtx.lookup("queue/A");
      queB = (Queue) iniCtx.lookup("queue/B");
      session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
      conn.start();
     }

     public void sendRecvAsync(String textBase) throws JMSException,
       NamingException, InterruptedException {
      System.out.println("Begin sendRecvAsync");

      // Setup the PTP connection, session
      setupPTP();

      // Set the async listener for queA
      QueueReceiver recv = session.createReceiver(queA);
      recv.setMessageListener(new ExListener());

      // Send a few text msgs to queB
      QueueSender send = session.createSender(queB);

      for (int m = 0; m < 10; m++) {
       TextMessage tm = session.createTextMessage(textBase + "#" + m);
       tm.setJMSReplyTo(queA);
       send.send(tm);
       System.out.println("sendRecvAsync, sent text=" + tm.getText());
      }
      System.out.println("End sendRecvAsync");
     }

     public void stop() throws JMSException {
      conn.stop();
      session.close();
      conn.close();
     }

     public static void main(String args[]) throws Exception {
      System.out.println("Begin SendRecvClient,now="
        + System.currentTimeMillis());
      SendRecvClient client = new SendRecvClient();
      client.sendRecvAsync("A text msg");
      client.done.acquire();
      client.stop();
      System.exit(0);
      System.out.println("End SendRecvClient");
     }

    }



    ]]>
    վ֩ģ壺 ޡvþþ뾫Ʒ| ޹AV| ѵɬɬƵ߲| avӰѿ| Ƶһ| ƬaëƬ| ý61| ޳˸߹ۿ| ۺ| aëƬ˾þ| ѻɫַ| ޾ƷAAƬ߹ۿ| 99reֻоƷ| ɫ͵͵| ŷƷպһ| СƵ߹ۿ | ĻĻmv| 2020ˬ| Ƶ| ëƬۿ| ҹƷ߹ۿ| ɫ߹ۿַ| avһ߲| 99ȳ˾ƷȾþ | þô㽶վ| ޹Һ2020| ƵպƵ| պޱ̬| ѹۿƷ| 91Ƶ߹ۿѴȫ| þùƷ| պƵ| ɫ͵͵ۺAV| һһ| gvվ| Ұһ | þþþþAVר| ëƬ޾Ʒ| ˬýôƵ| պһ | ޾Һվ|