页面树结构
转至元数据结尾
转至元数据起始

(本文档仅供参考)

问题

         在Windows、Linux环境或者docker等环境中部署了smartbi,要如何连接mongodb数据库?

解决方案        

        说明:

         1、若是mongodb数据库本身是没有启用安全校验,这样话,在连接过程如果显示【未指定错误:com/mongodb/MongoClient】,请参考此文档添加对应的 _JDBC_mongo-java-driver-3.4.2.jar 解决:8.0及以上版本连接MongoDB数据库时显示未指定错误:com/mongodb/MongoClient 

         2、如果报 Caused by: java.lang.NoSuchFieldError: ACKNOWLEDGED  ,这个是因为MongoDB的驱动没有放到war包里的WEB-INF\lib目录下               

         3、如果mongodb数据库启用了安全校验,即需要用用户名和密码登录才可以连接,则继续参考此文档解决。

         4、注意目前产品不支持mongodb跨库查询,就是说只能获取到当前连接数据库下的表,无法获取到Mongobd其他数据库下的表。

         5、在开启mongodb数据库的安全校验的时候。需要先切到对应的数据库下,然后再执行创建对应的用户权限 ,比如说创建test数据库的用户密码,需要在mongodb数据库客户端执行如下语句,更多资料可以网上搜索。

设置用户认证登录
1、添加管理员账号
# 在本机终端下使用命令进入MongoDB Shell
# 默认数据端口绑定为:38028
root@meteors:~# cd /data/mongodb-linux-x86_64-ubuntu1604-3.4.10/bin
root@meteors:~# ./mongo --host 127.0.0.1:27017

# 以下操作将会在mongo shell 中进行操作
# 切换到admin库
> use admin
switched to db admin
# 添加admin库的用户(账号为root,密码为123456)
> db.createUser({user:"root",pwd:"123456",roles:[{"role":"root","db":"admin"}]})
Successfully added user: {
        "user" : "root",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}
 
创建其他用户认证登录
# 切换到test库
> use test
switched to db admin
# 添加test库的用户(账号为test,密码为123456)
> db.createUser({user:"test",pwd:"123456",roles:[{"role":"dbOwner","db":"test"}]})
Successfully added user: {
        "user" : "test",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "test"
                }
        ]
}


        详细步骤:

         1、首先先按照正常方式连接mongodb 数据,具体可参考文档:NoSQL数据源-连接Mongodb数据库

         2、如果正常连接后报错,显示【未指定错误:com/mongodb/MongoClient】,按照 8.0及以上版本连接MongoDB数据库时显示未指定错误:com/mongodb/MongoClient 添加jar包,重启smartbi。

         3、添加_JDBC_mongo-java-driver-3.4.2.jar 后,重启服务器,访问的时候还是报未指定错误,Caused by: java.lang.NoSuchMethodError: org.bson.types.ObjectId.toHexString()Ljava/lang/String;

              此问题是因为jar包类文件冲突导致的,可以依据这个类 org.bson.types.ObjectId 在smartbi中【系统监控】–》【类查找】确定下,这个类文件来源哪个jar包,如下图,正常加载的类文件是ifxjdbc.jar,这个jar包是用于连接Informix数据库的驱动包,和mongodb的驱动包冲突了,如果项目不需要使用Informix数据库,直接将 ifxjdbc.jar 删除,然后重启服务器。

         


         4、对于非Windows环境部署smartbi ( PS : Windows环境的smartbi(V97及以前的版本)可以自动创建对应的mongodb客户端执行程序,因为可能存在安全漏洞,V10及更新版本产品已经移除需要手动添加),这是非常重要的一个步骤,在mongodb数据库启用安全校验的情况下,对于安全校验的执行验证是必须要通过mongodb数据库的mongo 客户端程序进行的,但因不同环境版本mongodb数据库的mongo客户端程序文件也是不一样的,就是说mongo客户端程序文件必须和执行环境系统相符合,对于如何获取到符合smartbi所部署的操作系统的mongo客户端执行程序文件,具体请看如下操作:

           (1)确定smartbi所部署环境的系统信息,注意如果是部署在docker容器中,需要确定docker容器中的操作系统,不是docker所在机器的操作系统。

           (2)确定smartbi所部署环境的系统信息后,登录到mongodb数据库的官网:https://www.mongodb.com/   进入Products–>MongoDB Shell或MongoDB Server

             (3)window操作系统的可以直接使用下载解压mongodb-win客户端.rar,目前暂时是兼容所有版本,后续如果出现无法支持的情况需要去官网下载对应的客户端包

下载客户端说明:

mongoDB5之前的版本,MongoDB 客户端执行程序文件是与MongoDB Server集成在一起的,客户端名称为mongo (Linux)、mongo.exe(window),目前mongo已经在新版将客户端执行程序抽离单独在MongoDB Shell下载,而且较新版本的客户端名称为mongosh (Linux)、mongosh.exe(window),新版的客户端名称后多了sh,下载后的文件需要重命名为mongo、mongo.exe ,详细下一步说明

mongoDB5及之前的版本,下载server的mongodb Server安装包,找到里面的客户端:

            

          

         

        (3)依据smartbi所在的操作系统下载好的shell客户端或mongodb安装包后,解压,找到mongo客户端程序文件。

mongoDB 5之前的版本,MongoDB 客户端执行程序文件名称为mongo (Linux)、mongo.exe(window),MongoDB Shell下载的客户端名称为mongosh (Linux)、mongosh.exe(window),新版的客户端名称后多了sh。下载后需要重命名为mongo、mongo.exe 。


新版的shell客户端需要先重命名mongo客户端执行程序文件

window操作系统:


linux操作系统改名:


旧版的mongo在解压mongodb安装包,找到mongo客户端程序文件

          

        (4)需要在exts-smartbi同层目录级别下手动创建mongo-smartbi (文件名和应用名一致,如果是smartbi,就是mongo-smartbi,如果是spreadsheet,就是mongo-spreadsheet),然后再在这个文件夹同时加载上一步骤获取到的Mongo客户端程序文件,然后重启smartbi服务。

           

           

          5、如果启动后,测试连接提示【Canot get a connection,pool exhausted......Caused by: java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed】

Cannot get a connection, pool exhausted
	at smartbi.freequery.basicdata.MetaDataServiceImpl.testConnection(MetaDataServiceImpl.java:401)
	at ...(...)
	at smartbi.connectionpool.ConnectionPool.driverConnect(ConnectionPool.java:282)
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted
	at org.apache.commons.dbcp.PoolingDriver.connect(PoolingDriver.java:183)
	at smartbi.connectionpool.ConnectionPool.driverConnect(ConnectionPool.java:282)
	at smartbi.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:456)
	at smartbi.connectionpool.ConnectionPool.getConnection(ConnectionPool.java:418)
	at smartbi.freequery.basicdata.MetaDataServiceImpl.testConnection(MetaDataServiceImpl.java:380)
	at smartbi.freequery.client.datasource.DataSourceService.testConnection(DataSourceService.java:180)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at smartbi.framework.rmi.ClientService.execute(Smartbi:118)
	at smartbi.framework.rmi.RMIServlet.processExecute(RMIServlet.java:218)
	at smartbi.framework.rmi.RMIServlet.doPost(RMIServlet.java:156)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at smartbi.extension.ExtensionFilter$2.doFilter(ExtensionFilter.java:156)
	at smartbi.extension.ExtensionFilter$1.doFilter(ExtensionFilter.java:145)
	at smartbi.extension.ExtensionFilter.doFilterInternal(ExtensionFilter.java:168)
	at smartbi.extension.ExtensionFilter.doFilter(ExtensionFilter.java:55)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at smartbi.framework.rmi.TransactionFilter.doFilter(Smartbi:93)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at smartbi.freequery.filter.GZIPFilter.doFilter(GZIPFilter.java:169)
	at smartbi.freequery.filter.Filter.doFilter(Filter.java:36)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at smartbi.freequery.filter.CheckIsLoggedFilter.doFilter(CheckIsLoggedFilter.java:138)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at smartbi.freequery.filter.TraceFilter.doFilter(TraceFilter.java:59)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed
	at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:871)
	at smartbi.connectionpool.ConnectionPool$5.borrowObject(ConnectionPool.java:622)
	at org.apache.commons.dbcp.PoolingDriver.connect(PoolingDriver.java:175)
	... 55 more


         此问题是因为在第4步骤中找到的mongo客户端程序和smartbi所在机器的操作系统不匹配导致的,请重新确认smartbi所在机器的操作系统,然后在mongoDB数据库官网重新下载对应的文件。

          

         6、需要注意数据源的连接字符串写的正确,千万不要改成 jdbc://IP:端口号/database 的字符串方式,这种方式是无法连接成功的

   

          7、若测试连接时依然报第5点的错误,即【Canot get a connection,pool exhausted......Caused by: java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failed】,并且确定下载的mongo客户端程序文件和smartbi所在机器的操作系统相匹配。此时则需要查看mongo的部署方式,如果mongo的部署方式为副本集模式(由一个主节点和多个副本节点组成)。那么由于我们的smartbi目前只支持连接主节点,不支持连接从节点,所以如果连接的是从节点便会报该错。而smartbi不支持连接从节点是因为smartbi是通过调用MongoDatabase的runCommand接口实现查询的,而runCommand只能在主节点上运行,在从节点运行会报错。

Viewtracker License Missing

There is a problem with the license of the Viewtracker addon. Please check if you have a valid license.

授权码细节

 

  • 无标签