posts - 5,  comments - 0,  trackbacks - 0
  2010年5月14日
今天在用IBATIS帮别人写个程序的时候突然出现了一个很怪异的错误
com.ibatis.common.jdbc.exception.NestedSQLException:   
--- The error occurred in ./map/Guest.xml.  
--- The error occurred while applying a result map.  
--- Check the Guest.listGuest.  
--- Check the result mapping for the 'password' property.  
--- Cause: java.sql.SQLException: Column 'userpwd' not found.


at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:201)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:139)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:567)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForList(SqlMapClientImpl.java:94)
at com.zhxingchen.guestbook.dao.impl.BaseDAOImpl.queryAll(BaseDAOImpl.java:36)
at com.zhxingchen.guestbook.dao.impl.GuestDAOImpl.queryGuestByProperty(GuestDAOImpl.java:68)
at com.zhxingchen.guestbook.dao.impl.TestGuestDAO.testQueryByProperty(TestGuestDAO.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: java.sql.SQLException: Column 'userpwd' not found.


at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:983)
at com.mysql.jdbc.ResultSet.getString(ResultSet.java:4826)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.ibatis.common.jdbc.logging.ResultSetLogProxy.invoke(ResultSetLogProxy.java:47)
at $Proxy7.getString(Unknown Source)
at com.ibatis.sqlmap.engine.type.StringTypeHandler.getResult(StringTypeHandler.java:35)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getPrimitiveResultMappingValue(ResultMap.java:619)
at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getResults(ResultMap.java:345)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:384)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:300)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:189)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:221)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:189)
... 28 more
    出现这个错误的当头我就懵了,我怎么也想不明白数据库里面怎么会没有userpwd这个字段,我反复的对照都感觉数据库里是有的啊,最后终于让我找出了问题所在,等知道后我就晕了,一个很简单的映射错误,我居然反复了看了3个小时,可能是熬夜了思维停滞了吧!
以下是SQLMap.xml的两段段代码:第一段是定义了一个resultMap,第二段是利用这个resultMap返回
<resultMap id="listGuest" class="guest"> <result property="id"/> <result property="userName"/> <result property="password" column="userpwd"/> <result property="realName"/> <result property="gender"/> <result property="age"/> <result property="email"/> <result property="qq"/> </resultMap>
<statement id="queryGuestByProperty" parameterClass="guest" resultMap="listGuest"> SELECT ID as id, USERNAME as userName, USERPWD as password, USERREALNAME as realName, USERSSEX as gender, USERAGE as age, USEREMAIL as email, USERQQ as qq FROM GUEST <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="password"> USERNAME=#userName# </isNotNull>
...............
也许不仔细看还真看不出来,其实USERPWD在取出来的时候就已经转换成password了,难怪在resultMap中始终找不到userpwd,这样要是能找到才怪!~
改的话很容易,我倾向于改resultMap文件,将password后面的 column="userpwd"去掉就OK了!~
万事还得谨慎!!!!!
posted @ 2010-05-15 06:57 Zhjiang 阅读(989) | 评论 (0)编辑 收藏
今天早上在上班的路上突然想起来《锦瑟》,于是随便念了一下,走着走着,突然想读读这首诗,不为其他,只为兴起。
锦瑟  李商隐
锦瑟无端五十弦,一弦一柱思华年。
庄生晓梦迷蝴蝶,望帝春心托杜鹃。
沧海月明珠有泪,蓝田日暖玉生烟。
此情可待成追忆,只是当时已惘然。

    读诗,少不了要说作者的,李商隐(约812年或813年1—约858年),字义山,号玉谿生、樊南生。晚唐诗人。原籍河内怀州(今河南沁阳),祖辈迁荥阳(今河南郑州)。(此段摘自维基百科)
    这首诗描写了很多种物,也引用了两个典故,只有最后一联写的是情义。
    首先,我们来看看这首诗里面的物,分别有锦瑟,蝴蝶,杜鹃,沧海,月亮,珍珠,泪水,蓝田,太阳,玉,烟等等。除去中间引用的典故,其他基本都是静物。首先写锦瑟,这件物事开篇第一句就托出来了,点明全篇,我想当时作者可能是看到了这样一个锦瑟才引发了感慨,而且感慨颇深,每一弦一个雁柱都让作者想到了以前的欢乐的时光,可见这件物事对他来说铭心刻骨。然后是蝴蝶和杜鹃,当然这两个事物是作者引用的典故,其中有庄子的物我相容的典故和望帝的化杜鹃以寄意,可见作者对物的看法,也就进一步点名作者此刻的心情可能是和锦瑟想容了,或者是作者将这个物看作了另一个人,即借物怀人,这个我们日常也曾会有,譬如说有时候你看到一个镯子,可能和你送给你的朋友的信物很像,多年不见早已忘怀,如今再见,难道在你眼中只看到了那个镯子么?然后是沧海这一联,这一联中一连写了好多物事,有八个之多吧,其中有像珍珠、玉这样富贵的物事,也有像泪水,烟那样易逝让人悲伤的物事,更有像沧海、月亮、太阳、蓝田等亘古不变的物事,可见作者既描写了漫长,也描写了短暂,既描写了欢乐,也描写了悲伤,然而,快乐并非是永久的,因为点题的两个物事是泪和烟,可见欢乐的时光很短暂而悲伤和思念却相当漫长,可见作者思念之深。
    其次,这首诗里有一句是抒情的,此情可待成追忆,只是当时已惘然。那份情义本来是可以去期盼的但现在只能追忆,只是当时已经迷茫了。此句点题也呼应了第一联看到锦瑟后怀人。
    在这里我突然想起了一些故人,也许当年的吵闹其实真的没什么,却又葬送了一段美好的情义,难道我们不也是迷茫了么?因而,要好好把握现在的这份感情,毕竟在数十亿记的人群里,我们相遇,相知,到相爱是多么的不易,何苦非要闹到以后看到了一些旧物却只能以泪洗面,借物怀人呢!
    Ps: 在这首诗里的蓝田,我在几年前曾去过,一个本来以玉石闻名的地方现在只有青山依在,绿水长流。可见,就算有的时候是掌握了资源,掌握了财富,若干年后大家也没什么不同。所以对于那些和我一样在大都市里寻找角色的朋友,请你们不要悲伤,也不要郁闷,生命很短暂,如何在有限的时间里让生命更充实,让生活更轻松,让自己更快乐才是我们所应该考虑的事情。因为,我们要相信,时间才是仲裁者,一切的不平等,不平均在时间的面前都是泡沫,最后等会消散于无形。另外,蓝田值得你去看一下! 
posted @ 2010-05-14 19:57 Zhjiang 阅读(191) | 评论 (0)编辑 收藏
Apache Qpid:
Wiki上的描述是:
Apache Qpid is an open source (Apache 2.0 licensed) messaging system which implements the Advanced Message Queuing Protocol. It provides transaction management, queuing, distribution, security, management, clustering, federation and heterogeneous multi-platform support.
另外 Apache Qpid 还有很多特点,具体请查阅 http://qpid.apache.org/

OK,不废话,进入正题,我今天搞了一天才将其配置好,稍微会有一点麻烦,不过还算好用,对于用到Message Queue或者想用的朋友,可以尝试一下!
首先进入http://qpid.apache.org/getting-started.html,然后进入download 页面,由于我是用JAVA来开发,所以我选择下载Mutiple Component Packages条目下的JAVA broker,client & tools这一个,用C++开发或者其他语言开发的也可以适当选择下载。另外还有一个适用的工具可以下载是在Management tools条目下面(是一个基于Eclipse RUP 的软件,由于今天调了半天没调好所以就不说明了)
然后回到getting-start那一页看安装说明: 在这里我稍微说下吧,反正也很简单(解压什么的就略过了)!
1. 设置环境变量,这里有两个环境变量需要设置 QPID_HOME 和QPID_WORK,上面的E问很简单,QPID_WORK是用来设置broker产生文件的路径,主要是LOG吧。
2.修改%QPID_HOME%\etc\config.xml文件,主要是修改management下面的<keyStorePath></keyStorePath>的文件路径,否则直接启动会出现一个莫名其妙的找不到文件的错误
3.修改%QPID_HOME%\bin\create-example-ssl-strores.bat文件这里要修改三处,将-keystore后面的路径换成你在第二部设置的文件路径,这里可以看到这个批处理文件其实用的是%JAVA_HOME%\bin的keytool命令,有关keytool的命令详解可以看http://shenzhenchufa.blog.51cto.com/730213/169390(这篇不是我写的,不好转载,只好给链接,但是很详细)
4.执行create-example-ssl-strores,然后执行qpid-server命令即可,你可以发现broker很正常的启动了
在测试到broker启动之后可以利用svn Check(https://svn.apache.org/repos/asf/qpid/trunk/qpid/java/client/example/)来得到具体例子(PS:什么还不会有SVN???)里面的例子写的还不错,很详细,示例可以导入eclipse中执行,当然,在执行示例的时候如果把broker给关掉了就不能出来结果了,当运行jmsexample下面的Hello.java出现了Hello world时,那么恭喜你,Qpid安装成功了,然后想干什么就可以具体发挥了!

对于JMS的Prodcer(PTP)/Publisher(PUB/SUB)执行步骤一般是
1.通过ConnectionFactroy得到Connection(请注意Qpid示例中properties文件的connectionfactory.xxxxx键后面对应的值一般都是amqp://xxxx:xxxx@xxxx/xxx?brokerlist='tcp://localhost:5672'格式的)
2. 通过Connection获得一个Session(PTP)/TopicSession(PUB/SUB)
3. 获得MessageProducer(PTP)/Topic(PUB/SUB)
4. 产生/发布消息
5. 关闭Connection(当关闭Connection的时候,Session 也会自动关闭)
消费者/订阅之的执行步骤几乎差不多,就是第四步是消费/订阅消息

好了,今天就写到这吧,很简单的介绍,以后再慢慢写,有什么问题,大家可以共同探讨下!
最后,注意文明用语,谢谢!~~~~

posted @ 2010-05-14 18:48 Zhjiang 阅读(1200) | 评论 (0)编辑 收藏
<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(1)

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜