jetty+mongodb 配置session外部数据库存储
2013-06-19 16:24
495 查看
monbgodb简介 主页 http://www.mongodb.org/
oschina.net 介绍页 http://www.oschina.net/p/mongodb
在linux下先编译安装下吧。下载mongodb源码 http://downloads.mongodb.org/src/mongodb-src-r2.4.4.tar.gz
也可以下载二进制的,有各种平台的。80多MB,挺大的。建议下载二进制,因为源码编译 虽然眼前一亮,学到点新东西,但是编译体积太大了。我来研究下源码编译mongodb吧。
解压mongodb-src-r2.4.4.tar.gz后,进入目录,发现没有configure或者Makefile,一时木了,不知所戳,姑搜索 编译mongodb ,原来是这样啊:
第一步 安装SCons
Scons是一个Python写的自动化构建工具,比传统的GNU make更加简便、可靠以及高效。
到http://sourceforge.net/projects/scons/files/scons/下载源码压缩包,解压之后按照如下步骤进行安装:
Centos下也可以yum install scons
第二步 编译Mongodb
进入mongodb源码目录
默认编译完毕要花很久的时间,而且编译体积太大了。查看下源码目录
View Code
service mongod start
service mongod status
就开启了服务了。
打开浏览器 输入 http://IP:27017 显示:
按照提示,将端口号增加1000 ,打开 http://IP:28017 将会显示一个mongod服务的概述吧。此功能 或许应该关闭。
测试Insert update delete select 操作
输入mongo 即可打开客户端,连接默认端口 默认本机的mongodb的服务。
输入
第二阶段 配置jetty与mongodb之间的连接
按照官方文档,http://wiki.eclipse.org/Jetty/Tutorial/MongoDB_Session_Clustering
我把一些配置 加入到jetty.xml中,重启jetty 报错。大概是 org.eclipse.jetty.nosql.mongodb.* 不知道在哪里,后来我发现:
我发现eclipse的jetty网页 是十分让人恶心的,至少是我。
在 http://download.eclipse.org/jetty/stable-8/apidocs/ 明明有nosql.mongodb 的javadoc http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.html
但是我从 http://download.eclipse.org/jetty/ 下载的stable-8 里面的javadoc中却没有这块内容,为什么神奇的消失了?后来看到老外的一个文章
http://www.jamesward.com/2011/11/30/using-mongodb-for-a-java-web-apps-httpsession
使用maven来下载jetty插件,然后再%HOME%\.m2\repository\org\eclipse\jetty 出现了 jetty-nosql jetty-nosql-8.0.3.v20111011.jar ,终于看到了这个包,里面有nosql\mongodb 了。我就奇怪了,eclipse的jetty网站下载jetty 为什么没有jetty-nosql呢?如果是第三方,哪为什么在apidoc里面还有nosql的javadoc呢?
恶心。恶心eclipse。
好吧,继续配置jetty与mongodb:
jetty-nosql 下载:http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-nosql/8.1.11.v20130520/
还有一个mongodb-java-driver:http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/2.7.3/
具体 有关mongodb 的java驱动 看: http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/
然后我开始了另一端苦逼的研究,把这俩jar文件放到哪里呢?我放到/root/下,然后设置CLASSPATH,添加了这两个jar的绝对路径【后来证明我的做法不被支持,继续看吧】,修改$JETTY_HOME/start.ini 加入了一个 配置选项:
然后 touch etc/jetty-nosql.xml ,里面内容如下:
这个看起来是xml,其实确实是xml,但是里面的内容不是随便搞的,其会映射为一些java代码的。随便写点内容,jetty就会报异常的,我service jetty restart 报错为:
没有找到类,哪就是我设置的jar的classpath居然没用,对于一般的java程序是管用的。然后研究,java -jar start.jar --help 有--list-options和--list-config 其都是在start.jar里面一个start.config的文件里面的配置,查看了下,里面的OPTIONS 其实就是指定的一些jar包,然后配合jetty-XXX.xml,就可以实现这一方面的功能了,比如jetty-ajp-VERSION.jar和jetty-ajp.xml,我在start.ini里面加入OPTIONS ajp,和etc/jetty-ajp.xml 才有了ajp的功能。
那么我的mongodb-java-driver.jar和jetty-nosql.jar放到哪里呢?难道要我修改start.jar里面的配置文件再放入,jetty,java,你有必要这么麻烦么?配置文件,你有必要弄的这样个性化,不具备普及型么?后来才发现,原来 jetty额外的包(jar文件)应该放到jetty目录的/lib/ext目录下,而不是/lib目录下。
你妹的,真方便,把两个jar放入lib/ext 再开启服务,果然OK,找到了这些个jar了,搜索jar本来是jvm干的事情,用classpath就可以做到,你非要逆天而行,自己搜索jar,还不接受jvm搜索jar的classpath路径,好吧,我认输,java有太多的这样的事情了。
测试 session是否存储到mongodb上,以及mongodb的分布式配置
TODO。。。
参考链接:
http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html
http://www.scons.org/doc/production/HTML/scons-user/index.html
http://www.scons.org/doc/production/HTML/scons-man.html
http://cn.docs.mongodb.org/manual/
http://docs.mongodb.org/manual/
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/
/article/5108159.html mongodb 系列文章
MongoDB与sql语句对照表
oschina.net 介绍页 http://www.oschina.net/p/mongodb
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 面向集合存储,易存储对象类型的数据。 模式自由。 支持动态查询。 支持完全索引,包含内部对象。 支持查询。 支持复制和故障恢复。 使用高效的二进制数据存储,包括大型对象(如视频等)。 自动处理碎片,以支持云计算层次的扩展性 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 文件存储格式为BSON(一种JSON的扩展) 可通过网络访问 所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。 模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。 MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB 在32位模式运行时支持的最大文件尺寸为2GB。 MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。
在linux下先编译安装下吧。下载mongodb源码 http://downloads.mongodb.org/src/mongodb-src-r2.4.4.tar.gz
也可以下载二进制的,有各种平台的。80多MB,挺大的。建议下载二进制,因为源码编译 虽然眼前一亮,学到点新东西,但是编译体积太大了。我来研究下源码编译mongodb吧。
解压mongodb-src-r2.4.4.tar.gz后,进入目录,发现没有configure或者Makefile,一时木了,不知所戳,姑搜索 编译mongodb ,原来是这样啊:
第一步 安装SCons
Scons是一个Python写的自动化构建工具,比传统的GNU make更加简便、可靠以及高效。
到http://sourceforge.net/projects/scons/files/scons/下载源码压缩包,解压之后按照如下步骤进行安装:
python setup.py install
Centos下也可以yum install scons
第二步 编译Mongodb
进入mongodb源码目录
scons all scons –prefix=/usr/local/mongodb install -j 8 如果想要头文件和lib包,执行 scons –prefix=/usr/local/mongodb –full install -j 8
默认编译完毕要花很久的时间,而且编译体积太大了。查看下源码目录
# mongo.conf #where to log logpath=/var/log/mongo/mongod.log logappend=true # fork and run in background fork = true #port = 27017 dbpath=/var/lib/mongo # location of pidfile pidfilepath = /var/run/mongodb/mongod.pid # Disables write-ahead journaling # nojournal = true # Enables periodic logging of CPU utilization and I/O wait #cpu = true # Turn on/off security. Off is currently the default #noauth = true #auth = true # Verbose logging output. #verbose = true # Inspect all client data for validity on receipt (useful for # developing drivers) #objcheck = true # Enable db quota management #quota = true # Set oplogging level where n is # 0=off (default) # 1=W # 2=R # 3=both # 7=W+some reads #diaglog = 0 # Ignore query hints #nohints = true # Disable the HTTP interface (Defaults to localhost:27018). #nohttpinterface = true # Turns off server-side scripting. This will result in greatly limited # functionality #noscripting = true # Turns off table scans. Any query that would do a table scan fails. #notablescan = true # Disable data file preallocation. #noprealloc = true # Specify .ns file size for new databases. # nssize = <size> # Accout token for Mongo monitoring server. #mms-token = <token> # Server name for Mongo monitoring server. #mms-name = <server-name> # Ping interval for Mongo monitoring server. #mms-interval = <seconds> # Replication Options # in replicated mongo databases, specify here whether this is a slave or master #slave = true #source = master.example.com # Slave only: specify a single database to replicate #only = master.example.com # or #master = true #source = slave.example.com
View Code
service mongod start
service mongod status
就开启了服务了。
打开浏览器 输入 http://IP:27017 显示:
You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number
按照提示,将端口号增加1000 ,打开 http://IP:28017 将会显示一个mongod服务的概述吧。此功能 或许应该关闭。
测试Insert update delete select 操作
输入mongo 即可打开客户端,连接默认端口 默认本机的mongodb的服务。
输入
db.test.save( { a: 1 } ) db.test.find()
第二阶段 配置jetty与mongodb之间的连接
按照官方文档,http://wiki.eclipse.org/Jetty/Tutorial/MongoDB_Session_Clustering
我把一些配置 加入到jetty.xml中,重启jetty 报错。大概是 org.eclipse.jetty.nosql.mongodb.* 不知道在哪里,后来我发现:
我发现eclipse的jetty网页 是十分让人恶心的,至少是我。
在 http://download.eclipse.org/jetty/stable-8/apidocs/ 明明有nosql.mongodb 的javadoc http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.html
但是我从 http://download.eclipse.org/jetty/ 下载的stable-8 里面的javadoc中却没有这块内容,为什么神奇的消失了?后来看到老外的一个文章
http://www.jamesward.com/2011/11/30/using-mongodb-for-a-java-web-apps-httpsession
使用maven来下载jetty插件,然后再%HOME%\.m2\repository\org\eclipse\jetty 出现了 jetty-nosql jetty-nosql-8.0.3.v20111011.jar ,终于看到了这个包,里面有nosql\mongodb 了。我就奇怪了,eclipse的jetty网站下载jetty 为什么没有jetty-nosql呢?如果是第三方,哪为什么在apidoc里面还有nosql的javadoc呢?
恶心。恶心eclipse。
好吧,继续配置jetty与mongodb:
jetty-nosql 下载:http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-nosql/8.1.11.v20130520/
还有一个mongodb-java-driver:http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/2.7.3/
具体 有关mongodb 的java驱动 看: http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/
然后我开始了另一端苦逼的研究,把这俩jar文件放到哪里呢?我放到/root/下,然后设置CLASSPATH,添加了这两个jar的绝对路径【后来证明我的做法不被支持,继续看吧】,修改$JETTY_HOME/start.ini 加入了一个 配置选项:
etc/jetty-nosql.xml
然后 touch etc/jetty-nosql.xml ,里面内容如下:
<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> <Configure id="Server" class="org.eclipse.jetty.server.Server"> <Set name="sessionIdManager"> <New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager"> <Arg> <Ref id="Server" /> </Arg> <Set name="workerName">fred</Set> <Set name="ScavengePeriod">60</Set> </New> </Set> <Call name="setAttribute"> <Arg>mongoIdMgr</Arg> <Arg> <Ref id="mongoIdMgr"/> </Arg> </Call> <New id="mongodb" class="com.mongodb.Mongo"> <Arg> <New class="java.util.ArrayList"> <Call name="add"> <Arg> <New class="com.mongodb.ServerAddress"> <Arg type="java.lang.String">localhost</Arg> <Arg type="int">27017</Arg> </New> </Arg> </Call> <!-- Add more Call statements here as desired --> </New> </Arg> <Call name="getDB"> <Arg>HttpSessions</Arg> <Call id="sessionDocument" name="getCollection"> <Arg>sessions</Arg> </Call> </Call> <!-- If you want to configure Jetty to be able to read through the slaves, call the following: --> <Call name="slaveOk"/> </New> <Set name="sessionIdManager"> <New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager"> <Arg> <Ref id="Server"/> </Arg> <Arg> <Ref id="sessionDocument"/> </Arg> <Set name="workerName">fred</Set> <Set name="scavengePeriod">60</Set> </New> </Set> </Configure>
这个看起来是xml,其实确实是xml,但是里面的内容不是随便搞的,其会映射为一些java代码的。随便写点内容,jetty就会报异常的,我service jetty restart 报错为:
[root@localhost jetty]# service jetty restart Stopping Jetty: OK Starting Jetty: 2013-06-22 11:35:20.287:WARN:oejx.XmlConfiguration:Config error at <Set name="sessionIdManager">|?<New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager"><Arg>|???<Ref id="Server"/>|??</Arg><Set name="workerName">fred</Set><Set name="scavengeInterval">60</Set></New>|</Set> java.lang.ClassNotFoundException: org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.eclipse.jetty.start.Main.invokeMain(Main.java:473) at org.eclipse.jetty.start.Main.start(Main.java:615) at org.eclipse.jetty.start.Main.main(Main.java:96) Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at org.eclipse.jetty.util.Loader.loadClass(Loader.java:100) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:354) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:754) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1126) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1029) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:422) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:384) at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:343) at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:296) at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1247) at java.security.AccessController.doPrivileged(Native Method) at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1182) ... 7 more Usage: java -jar start.jar [options] [properties] [configs] java -jar start.jar --help # for more information FAILED Sat Jun 22 11:35:23 CST 2013 [root@localhost jetty]#
没有找到类,哪就是我设置的jar的classpath居然没用,对于一般的java程序是管用的。然后研究,java -jar start.jar --help 有--list-options和--list-config 其都是在start.jar里面一个start.config的文件里面的配置,查看了下,里面的OPTIONS 其实就是指定的一些jar包,然后配合jetty-XXX.xml,就可以实现这一方面的功能了,比如jetty-ajp-VERSION.jar和jetty-ajp.xml,我在start.ini里面加入OPTIONS ajp,和etc/jetty-ajp.xml 才有了ajp的功能。
那么我的mongodb-java-driver.jar和jetty-nosql.jar放到哪里呢?难道要我修改start.jar里面的配置文件再放入,jetty,java,你有必要这么麻烦么?配置文件,你有必要弄的这样个性化,不具备普及型么?后来才发现,原来 jetty额外的包(jar文件)应该放到jetty目录的/lib/ext目录下,而不是/lib目录下。
你妹的,真方便,把两个jar放入lib/ext 再开启服务,果然OK,找到了这些个jar了,搜索jar本来是jvm干的事情,用classpath就可以做到,你非要逆天而行,自己搜索jar,还不接受jvm搜索jar的classpath路径,好吧,我认输,java有太多的这样的事情了。
测试 session是否存储到mongodb上,以及mongodb的分布式配置
TODO。。。
参考链接:
http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html
http://www.scons.org/doc/production/HTML/scons-user/index.html
http://www.scons.org/doc/production/HTML/scons-man.html
http://cn.docs.mongodb.org/manual/
http://docs.mongodb.org/manual/
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/
/article/5108159.html mongodb 系列文章
MongoDB与sql语句对照表
SQL Statement | Mongo Query Language Statement |
---|---|
CREATE TABLE USERS (a Number, b Number) | implicit; can be done explicitly |
INSERT INTO USERS VALUES(1,1) | db.users.insert({a:1,b:1}) |
SELECT a,b FROM users | db.users.find({}, {a:1,b:1}) |
SELECT * FROM users | db.users.find() |
SELECT * FROM users WHERE age=33 | db.users.find({age:33}) |
SELECT a,b FROM users WHERE age=33 | db.users.find({age:33}, {a:1,b:1}) |
SELECT * FROM users WHERE age=33 ORDER BY name | db.users.find({age:33}).sort({name:1}) |
SELECT * FROM users WHERE age>33 | db.users.find({'age':{$gt:33}})}) |
SELECT * FROM users WHERE age<33 | db.users.find({'age':{$lt:33}})}) |
SELECT * FROM users WHERE name LIKE "%Joe%" | db.users.find({name:/Joe/}) |
SELECT * FROM users WHERE name LIKE "Joe%" | db.users.find({name:/^Joe/}) |
SELECT * FROM users WHERE age>33 AND age<=40 | db.users.find({'age':{$gt:33,$lte:40}})}) |
SELECT * FROM users ORDER BY name DESC | db.users.find().sort({name:-1}) |
CREATE INDEX idx_name ON users(name) | db.users.ensureIndex({name:1}) |
CREATE INDEX idx_name ON users(name,ts DESC) | db.users.ensureIndex({name:1,ts:-1}) |
SELECT * FROM users WHERE a=1 and b='q' | db.users.find({a:1,b:'q'}) |
SELECT * FROM users LIMIT 10 SKIP 20 | db.users.find().limit(10).skip(20) |
SELECT * FROM users WHERE a=1 or b=2 | db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } ) |
SELECT * FROM users LIMIT 1 | db.users.findOne() |
EXPLAIN SELECT * FROM users WHERE z=3 | db.users.find({z:3}).explain() |
SELECT DISTINCT last_name FROM users | db.users.distinct('last_name') |
SELECT COUNT(*y) FROM users | db.users.count() |
SELECT COUNT(*y) FROM users where AGE > 30 | db.users.find({age: {'$gt': 30}}).count() |
SELECT COUNT(AGE) from users | db.users.find({age: {'$exists': true}}).count() |
UPDATE users SET a=1 WHERE b='q' | db.users.update({b:'q'}, {$set:{a:1}}, false, true) |
UPDATE users SET a=a+2 WHERE b='q' | db.users.update({b:'q'}, {$inc:{a:2}}, false, true) |
DELETE FROM users WHERE z="abc" | db.users.remove({z:'abc'}); |
相关文章推荐
- Jetty集群配置Session存储到MySQL、MongoDB
- Jetty容器集群配置Session存储到MySQL、MongoDB
- Jetty集群配置Session存储到MySQL、MongoDB
- 分布式文档存储数据库(MongoDB)副本集配置
- 大数据时代的数据存储,非关系型数据库MongoDB
- 非关系型数据库MongoDB安装及环境变量配置
- 做个友善的系统配置页面、数据库连接串加密方式存储在配置文件的做法参考
- MongoDB 3.4.x 数据库安装和配置--Linux篇
- 做个友善的系统配置页面、数据库连接串加密方式存储在配置文件的做法参考
- Node.js session 用mongodb存储之 socket.io访问session的值
- PHP中使用memcache存储session的三种配置方法
- 配置mongodb分片群集(sharding cluster){淘宝数据库技术团队}
- 分布式文件存储的数据库开源项目MongoDB
- MongoDB存储配置
- 配置 PHP 的 Session 存储到 Redis
- 非关系型数据库MongoDB的配置方法
- PHP独立Session数据库存储操作类分享
- session的存储方式和配置
- spring 使用外部配置文件访问数据库
- EMS6.0配置存储到数据库过程中遇到的问题