Java 如何检查每个服务器请求的Firebase连接?如何重新连接?

Java 如何检查每个服务器请求的Firebase连接?如何重新连接?,java,firebase,firebase-realtime-database,Java,Firebase,Firebase Realtime Database,我不知道这是不是一个很基本的问题。我正在尝试将Firebase添加到我的web应用服务器端JAVA,而不是android项目。我的目标是为特定实体的某些更改向客户端推送更新。我使用appengine作为数据库。因此,当实体更新时,我需要推实时数据库,clientsbrowser将侦听更新的节点。我试图从建立java连接开始。写了下面的代码。连接到数据库,但几秒钟后它就会断开连接 我应该再次初始化应用程序吗? 此外,一旦连接到Firebase,我是否必须检查连接是否仍然处于活动状态,以及推送到Fi

我不知道这是不是一个很基本的问题。我正在尝试将Firebase添加到我的web应用服务器端JAVA,而不是android项目。我的目标是为特定实体的某些更改向客户端推送更新。我使用appengine作为数据库。因此,当实体更新时,我需要推实时数据库,clientsbrowser将侦听更新的节点。我试图从建立java连接开始。写了下面的代码。连接到数据库,但几秒钟后它就会断开连接

我应该再次初始化应用程序吗? 此外,一旦连接到Firebase,我是否必须检查连接是否仍然处于活动状态,以及推送到Firebase?是否每次请求都必须重复? 有没有更好的方法写这个? 我非常感谢你的帮助。成功地用Javascript实现,但在JAVA端遇到困难。提前谢谢

@SuppressWarnings(
        { "unchecked" , "rawtypes" } )
    public static void initiateFirebaseDB() throws FileNotFoundException
        {

            if ( FirebaseApp.getApps().isEmpty() )
                {

                    AccessController.doPrivileged( new PrivilegedAction()
                        {
                            public Object run()
                                {
                                    FileInputStream serviceAccount = null;
                                    try
                                        {
                                            serviceAccount = new FileInputStream( /* path to the json file */  );
                                        }
                                    catch ( FileNotFoundException e )
                                        {
                                            e.printStackTrace();
                                        }

                                    FirebaseOptions options = new FirebaseOptions.Builder()
                                            .setCredential( FirebaseCredentials.fromCertificate( serviceAccount ) )
                                            .setDatabaseUrl( /* db url */ ).build();
                                    FirebaseApp.initializeApp( options );

                                    return null;
                                }
                        } );
                }

            DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference( ".info/connected" );
            connectedRef.addValueEventListener( new ValueEventListener()
                {
                    @Override
                    public void onDataChange( DataSnapshot snapshot )
                        {
                            boolean connected = snapshot.getValue( Boolean.class );
                            if ( connected )
                                System.out.println( "connected" );
                            else
                                {
                                    System.out.println( "not connected" );
                                }
                        }

                    @Override
                    public void onCancelled( DatabaseError error )
                        {
                            System.err.println( "Listener was cancelled" );
                        }
                } );
        }

跟踪连接状态主要用于移动应用程序,甚至不适用于Firebase相关任务,因为它是检测这些应用程序中网络连接状态变化的一种好方法。在移动设备中,这通常是一项重要但棘手的任务,所以这基本上是Firebase为这些开发人员提供的额外服务。这根本不是一个要求,而且很多应用程序都是从不听这个价值观的

Firebase数据库服务被视为一个神奇的单例:您应该像编写代码一样编写代码。有些调用确实能够报告错误,在这种情况下,您应该处理它们。但总的来说,在编写处理数据更新的代码时,您不应该花太多/任何时间考虑与服务器的连接。只要去做,它们就会起作用

Firebase也是一个最终一致的、最后一次写入的wins数据库,您应该围绕这个概念设计您正在做的事情。在NewsRush中,我们定期在服务器端用新值覆盖现有值,而不必检查是否需要更新。假设您的服务器节点已死亡,必须重新启动,或者出现网络错误,更新被删除且无法恢复?假设写操作被拒绝,因为另一个写操作先到达那里


Firebase没有提供任何机制来确定是什么让它成功了。写得比你想象的要频繁一点可以为你的应用程序提供自我修复的手段。别忘了,Firebase的一大特点是大规模/大容量。这不是一个好主意,它是一个实际的功能,您应该在这里利用它。

您不需要监视连接。Firebase将在短时间停机后自动重新连接,并同步脱机时所做的任何更改。这是实时数据库魔力的关键要素。非常感谢@Kato。我应该在哪里添加初始化firebase应用程序的代码?我看过firebase示例代码,它们包含在主函数中。我没有这样的方法。我的服务器只是更新实体值的端点。非常感谢@Chad。我应该在哪里添加初始化firebase应用程序的代码?我看过firebase示例代码,它们包含在主函数中。我没有这样的方法。我的服务器只是更新实体值的端点。@Kato&Chad-edit-对于每个请求,我都调用一个方法来初始化firebase db,其中它检查FirebaseApp.getApps.isEmpty是否为空,然后初始化为空。这是正确的方法吗?在不了解应用程序架构的情况下很难说,但通常会创建一个数据库单例,并在其中执行Firebase初始化。然后,数据库单例可以公开Firebase根引用,以便其他类实例可以访问它,或者提供助手方法来更直接地执行查询。。。我们没有单例数据库。我们有一个API服务器,它不断地跨不同的端点提供请求。对于每个请求,我都会检查此FirebaseApp.getApps.isEmpty并将数据推送到firebase db。工作到现在。。。